我正在创建模块(带子模块)。让我们称之为lib
。我正在尝试使其工作如下:
lib.__main__
)。它使用内部lib.utils
。importlib.import_module( name )
。lib.utils
。我有以下选择:
import utils
而不是import lib.utils
。我发现它有点误导,并希望避免这种情况。import lib.__main__
的文件。我唯一想做的事就是做sys.path.append(os.getcwd())
。它不仅看起来很脏,而且还使log.utils
模块加载两次。
是否有任何内容可以让我执行lib.__main__
,但需要在加载的模块中使用import lib.utils
?
答案 0 :(得分:1)
如果脚本名称引用目录或zipfile,则脚本名称将添加到sys.path的开头,并且该位置的 main .py文件将作为< strong>主要模块。
在您的情况下,如果您运行python lib mymodule
,则会lib
添加sys.path
并执行__main__.py
。 lib
不是一个包,它只是sys.path
中的一个目录。 __main__.py
不在包中,因此包相对导入不起作用。
由于lib
位于sys.path
,因此可以直接导入其顶级.py
文件,并且__init__.py
的所有子目录都是可导入的包。因此,__main__.py
和mymodule
都可以执行import utils
并获得相同的内容。
现在让人感到困惑。由于您位于lib
的父目录中,并且因为lib.__init__.py
,lib.utils
也有效。它只是那样,因为你当前的目录(或者你可能把目录添加到PYTHONPATH或其他东西)。所以,就python而言,你有两个不同的模块,因为你在两条不同的路径上到达那里。
解决方案是删除lib/__init__.py
。 lib
不应该打包。那么你有一个问题,如何处理像lib/utils.py
这样的模块。通常,可以创建一个包目录并将脚本移动到那里,以便获得命名空间封装。假设您调用该目录mypackages
,那么__main__.py
和mymodule.py
都可以import mypackages.utils
。