Python 在模块的同一子目录中导入文件
我的代码的结构如下所示:Python 在模块的同一子目录中导入文件,python,python-3.x,Python,Python 3.x,我的代码的结构如下所示: proj/ __init__.py main.py subdir/ __init__.py module1.py module2.py module1.py使用module2.py。和main.py使用module1.py和module2.py 我设法做到了: main.py中的import subdir.module1和import subdir.module2 from.modul
proj/
__init__.py
main.py
subdir/
__init__.py
module1.py
module2.py
module1.py
使用module2.py
。和main.py
使用module1.py
和module2.py
我设法做到了:
main.py中的import subdir.module1
和import subdir.module2
from.module2在module1.py中导入module2
我目前面临的问题是将module1
变成一个可执行脚本。当尝试直接运行时,我得到错误:
Traceback (most recent call last):
File "module1.py", line 1, in <module>
from .module2 import Module2
ModuleNotFoundError: No module named '__main__.module2'; '__main__' is not a package
module1.py的代码:
from .module2 import Module2
class Module1:
pass
def main():
m = Module2()
if __name__ == "__main__":
main()
module2.py的代码:
class Module2:
pass
_uuuinit_uuu.py文件是空的基本上所有内容都与“当前工作目录”相关。这通常是运行原始代码的文件夹表单,无论哪个文件正在执行import
语句。因此,在您的情况下,您可能必须:
来自子目录导入模块1,作为m1
或者类似的东西,不管导入的文件位于哪个文件夹。Python遵循的执行模型非常接近计算机上的常规程序。程序(或python脚本)位于$PATH
上的某个位置,它加载的任何库(或python模块)都位于不同的系统定义位置。Python打算安装。脚本放在路径上,模块埋在python目录的某个地方
一个例外是,当您运行脚本时,python会将其目录添加到模块的python路径中。因此,它的任何子目录碰巧有一个\uuuu init\uuuu.py
就变成了python包。运行main.py
时,它是一个脚本,subdir
是一个包。这允许module1.py
进行包的相对导入。有趣的是,main.py
本身不在包中,其级别的\uuuu init\uuuuu.py
没有导入
当您作为脚本运行module1.py
时,它也不是一个包。因此,包相对导入不再有效
解决方案是让所有这些都成为可安装的软件包。您定义了setup.py,并且,关于如何在那里设置,有多个选项。这是一个很好的资源。需要注意的一点是参数,该参数将从模块入口点自动生成脚本
这是一座需要攀登的大山,但由于项目超出了一个或两个模块,因此值得付出代价。如果您在main.py
中添加代码,这将有助于我们回答问题。添加了代码。这只是我在实际项目中尝试做的一个小例子,而不是模块导入。它们取决于python中配置的路径,最明显的是出现在sys.path
中的路径。Python将包括正在运行的脚本的路径,但不包括当前工作目录。如果在运行脚本时恰好位于./proj/目录中,则当前工作目录仅与./proj/目录相同。这实际上是技术上正确的答案。我想这是正确的解决方案。我会接受的,尽管这对我的问题来说完全是小题大做。最后,我用try-except包装导入,如果发生异常,则用另一种方式导入。
class Module2:
pass