2015-03-13 80 views
2

我正在创建模块(带有子模块)。我们称它为lib。我试图让它工作如下:Python:从执行的模块导入

  • 我能够运行它(有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

您是否遇到某种错误?只要'lib'和持有要导入的模块的目录位于python路径中,就应该这样工作。 – tdelaney 2015-03-13 16:28:06

+0

...假设'lib'是一个包(具有'__init __。py') – tdelaney 2015-03-13 16:29:36

+0

'lib'具有'__init __。py'并且位于当前目录中。当我将它('lib'的父项)添加到PYTHON_PATH或sys.path'import lib.utils'工作中,但再次加载模块时(因为'lib .__ main__'认为它使用'utils',而不是'lib.utils' )。 – Noxitu 2015-03-13 17:05:01

回答

1

From the docs

如果脚本名是指一个目录或压缩文件,脚本名被添加到sys.path中的开始和在该位置的主要 .py文件为主要执行模块。

在你的情况,如果运行python lib mymodulelib添加到sys.path__main__.py执行。 lib不是一个包,它只是一个目录在sys.path__main__.py不在包中,因此与包相关的导入不起作用。

由于libsys.path,其顶级.py文件可以直接导入并与__init__.py任何子目录导入的包。所以,__main__.pymymodule都可以做import utils并得到同样的结果。

现在它变得混乱。因为你坐在lib的父目录中,并且因为有lib.__init__.py,所以lib.utils也是有效的。它的唯一方式是因为你当前的目录(或者你可能将目录添加到PYTHONPATH或其他东西)。所以,就python而言,你有两个不同的模块,因为你在两条不同的路径上到达那里。

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