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模块.人们是怎么做到的?

我try 更改所有导入语句以排除src目录,但其他测试目录中的文件除外.这修复了问题并允许我运行main.py,但这样我就不能通过运行pytest命令来运行我的测试

Import a module from a relative path这并没有回答我的问题.在本例中,Persontry 导入位于不同目录中的文件,而我try 从同一目录导入.

最小示例:

包含main.py和main_window.py的src目录 try 使用命令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仍会try 从当前目录中查找您的文件.但是,它不会在当前目录中查找导入的模块,而是会在包含主文件的目录中查找.所以在我的例子中是C:\path\to,在你的例子中是C:\Users\arkad\Documents\repos\backpack-calculator\src.所以你可以看到它不会找到一个名为src.main_window的模块.您可以找到更多关于Python如何决定在official documentation中查找模块的信息.

您可以try 多种不同的解决方案.

Use PYTHONPATH

您可以通过设置一个名为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

Use the -m command line option

通过使用-m,我们告诉了Python我们希望它从当前目录中找到的模块(而不是文件)的名称.例如:

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

Use a shim main script

在包含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

Change your imports

因为您知道如果您运行python C:\path\to\src\main.py,则Python将在C:\path\to\src中查找模块,因此您不需要在from src.foo import bar中查找.你可以改成from foo import bar码.

Python相关问答推荐

如何在Deliveryter笔记本中从同步上下文正确地安排和等待Delivercio代码中的结果?

我必须将Sigmoid函数与r2值的两种类型的数据集(每种6个数据集)进行匹配,然后绘制匹配函数的求导.我会犯错

如何在类和classy-fastapi -fastapi- followup中使用FastAPI创建路由

Python中绕y轴曲线的旋转

Godot:需要碰撞的对象的AdditionerBody2D或Area2D以及queue_free?

如何在WSL2中更新Python到最新版本(3.12.2)?

梯度下降:简化要素集的运行时间比原始要素集长

多处理队列在与Forking http.server一起使用时随机跳过项目

使用Python和文件进行模糊输出

OpenGL仅渲染第二个三角形,第一个三角形不可见

使用Openpyxl从Excel中的折线图更改图表样式

用SymPy在Python中求解指数函数

提高算法效率的策略?

Polars Group by描述扩展

python的文件. truncate()意外地没有截断'

如何在Python中创建仅包含完整天数的月份的列表

将相应的值从第2列合并到第1列(Pandas )

多索引数据帧到标准索引DF

使用Scikit的ValueError-了解

按最大属性值Django对对象进行排序