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 如何确定从哪里导入模块的问题。
当您运行
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
的模块。
您可以尝试多种不同的解决方案。
您可以通过设置一个名为
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
。