Python:从执行的模块导入

时间:2015-03-13 16:10:17

标签: python import

我正在创建模块(带子模块)。让我们称之为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

1 个答案:

答案 0 :(得分:1)

From the docs

如果脚本名称引用目录或zipfile,则脚本名称将添加到sys.path的开头,并且该位置的 main .py文件将作为< strong>主要模块。

在您的情况下,如果您运行python lib mymodule,则会lib添加sys.path并执行__main__.pylib不是一个包,它只是sys.path中的一个目录。 __main__.py不在包中,因此包相对导入不起作用。

由于lib位于sys.path,因此可以直接导入其顶级.py文件,并且__init__.py的所有子目录都是可导入的包。因此,__main__.pymymodule都可以执行import utils并获得相同的内容。

现在让人感到困惑。由于您位于lib的父目录中,并且因为lib.__init__.pylib.utils也有效。它只是那样,因为你当前的目录(或者你可能把目录添加到PYTHONPATH或其他东西)。所以,就python而言,你有两个不同的模块,因为你在两条不同的路径上到达那里。

解决方案是删除lib/__init__.pylib不应该打包。那么你有一个问题,如何处理像lib/utils.py这样的模块。通常,可以创建一个包目录并将脚本移动到那里,以便获得命名空间封装。假设您调用该目录mypackages,那么__main__.pymymodule.py都可以import mypackages.utils