如何导入与我尝试从该目录外部运行的文件位于同一目录中的 python 文件?

问题描述 投票:0回答:1

PS C:\Users\arkad\Documents\repos\backpack-calculator> python C:\Users\arkad\Documents\repos\backpack-calculator\src\main.py Traceback (most recent call last):   File "C:\Users\arkad\Documents\repos\backpack-calculator\src\main.py", line 3, in <module>     from src.main_window import MainWindow ModuleNotFoundError: No module named 'src'

我似乎不知道如何以相对论的方式正确导入python模块。人们是如何做到的?

我尝试更改所有导入语句以排除 src 目录,但其他测试目录中的文件除外。这解决了问题并允许我运行 main.py 但随后我将无法通过运行 pytest 命令来运行我的测试

从相对路径导入模块这并不能回答我的问题。在这种情况下,人们尝试导入位于不同目录中的文件,而我尝试从同一目录导入。

最小示例:

包含 main.py 和 main_window.py 的 src 目录 尝试使用命令

python .\src\main.py
从 src 目录外部运行 main.py main.py:

from src.main_window import MainWindow

if __name__ == '__main__':
    mainWindow = MainWindow()

main_window.py:

class MainWindow():
    def __init__(self):
        print('test')
python pytest python-import
1个回答
0
投票

你遇到了 python 如何确定从哪里导入模块的问题。

当您运行

python main.py
时,Python将在当前目录中查找
main.py
,然后也在当前目录中查找导入的模块。但是,当您执行
python path\to\main.py
或使用绝对路径时,事情开始有点不同。 Python 仍会尝试从当前目录中查找文件(如果给出相对路径)。但它不会在当前目录中查找导入的模块,而是在包含主文件的目录中查找。因此,在我的示例中为
C:\path\to
,或者在您的示例中为
C:\Users\arkad\Documents\repos\backpack-calculator\src
。所以你可以看到它找不到一个名为
src.main_window
的模块。

您可以尝试多种不同的解决方案。

使用Python路径

您可以通过设置一个名为

PYTHONPATH
的环境变量来告诉 python 在哪里查找其他模块。我相信在 PowerShell 中执行此操作的语法是:

Set-Item -Path env:PYTHONPATH -Value 'C:\Users\arkad\Documents\repos\backpack-calculator'
python C:\Users\arkad\Documents\repos\backpack-calculator\src\main.py

使用
-m
命令行选项

通过使用

-m
,我们告诉 python 我们希望它从当前目录中找到的模块(而不是文件)的名称。例如:

cd C:\Users\arkad\Documents\repos\backpack-calculator
python -m src.main # src\main.py -> src.main

使用垫片主脚本

src
目录下创建一个文件并导入到主脚本中即可调用其入口函数。

# newmain.py
from src.main import main  # assuming you have a function called main
main()
cd C:\Users\arkad\Documents\repos\backpack-calculator
python newmain.py

更改您的导入

既然你知道如果你运行

python C:\path\to\src\main.py
,Python会在
C:\path\to\src
中寻找模块,那么你不需要做
from src.foo import bar
。您可以改为执行
from foo import bar

© www.soinside.com 2019 - 2024. All rights reserved.