Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在模块的同一子目录中导入文件_Python_Python 3.x - Fatal编程技术网

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