Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.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_Import_Import Hooks - Fatal编程技术网

Python 多次导入同一模块

Python 多次导入同一模块,python,import,import-hooks,Python,Import,Import Hooks,因此,几个小时后,我发现了我的应用程序中出现错误的原因。我的应用程序源的结构如下: main/ __init__.py folderA/ __init__.py fileA.py fileB.py 实际上,还有大约50多个文件。但这不是重点。在main/\uuuu init\uuuu.py中,我有以下代码:来自folderA.fileA import* 在folderA/_init__.py中,我有以下代码: sys.path.a

因此,几个小时后,我发现了我的应用程序中出现错误的原因。我的应用程序源的结构如下:

main/
    __init__.py
    folderA/
        __init__.py
        fileA.py
        fileB.py
实际上,还有大约50多个文件。但这不是重点。在
main/\uuuu init\uuuu.py
中,我有以下代码:
来自folderA.fileA import*

folderA/_init__.py
中,我有以下代码:

sys.path.append(pathToFolderA)
folderA/fileB.py
中,我有以下代码:

from fileA import *
问题是fileA会被导入两次。但是,我只想导入一次

解决这一问题的明显方法(至少对我来说)是将某些路径从
path
更改为
folderA.path


但是我觉得Python一开始就不应该有这个错误。还有哪些其他解决方法不要求每个文件都知道其绝对位置?

不要以这种方式修改sys.path,因为它提供了两种访问模块的方法(名称),从而导致您的问题

使用绝对或相反。(不明确的相对导入可以作为旧Python版本的最后手段。)

folderA/fileB.py 当然,你应该用特定的名字来代替那颗星。

  • 在实际程序中,修改
    sys.path
    不是您要做的事情。它损害了模块性和可移植性,与永久设置PYTHONPATH或将模块放在Python可以找到它的地方相比没有任何好处

  • 永远不要使用
    import*
    。它污染了您的名称空间,使您的代码不可预测

  • 您不希望folderA出现在
    sys.path
    上。它是
    main
    的子包,应始终如此对待。始终使用绝对导入到顶级包:
    import main.folderA
    而不是
    import folderA
    或其他任何内容;这将使您的代码更易于遵循、移动和安装

from main.folderA.fileA import *   # absolute
from .fileA import *               # unambiguous-relative
from fileA import *                # ambiguous-relative