7

我正在尝试以编程方式导入子模块。我的文件树如下所示:

oopsd/__init__.py
oopsd/oopsd.py
oopsd/driver/__init__.py
oopsd/driver/optiups.py

optiups.py 只打印“Hello World”。

oopsd.py 看起来像这样:

import importlib
importlib.import_module('oopsd.driver.optiups')

现在有了这个,我得到了这个例外:

Traceback (most recent call last):
  File "<frozen importlib._bootstrap>", line 1521, in _find_and_load_unlocked
AttributeError: 'module' object has no attribute '__path__'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "oopsd/oopsd.py", line 29, in <module>
    sys.exit(main())
  File "oopsd/oopsd.py", line 23, in main
    loaddriver()
  File "oopsd/oopsd.py", line 26, in loaddriver
    importlib.import_module('oopsd.driver.optiups')
  File "/usr/lib/python3.3/importlib/__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1586, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1567, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1514, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 313, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1586, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1567, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1524, in _find_and_load_unlocked
ImportError: No module named 'oopsd.driver'; oopsd is not a package

Python 3 中是否__path__还存在?

我也尝试过导入.driver.optiups,但这会产生:

TypeError: relative imports require the 'package' argument

__package__似乎不稳定,所以我迷路了。

我该如何以正确的方式做到这一点?

4

2 回答 2

20

这是一个老问题,但由于它被撞了,另一个答案是完全错误的,这是一个常见的问题:

你可能正在这样做。

python oopsd/oopsd.py

不要这样做。:)

具体来说,切勿尝试直接运行属于父包的文件。当您运行 时python FILENAME,Python 会将文件的包含目录添加到sys.path,并且不会添加当前目录。所以你oopsd/在你的路径中,每个模块都oopsd/变成了一个顶级模块。Python 甚至无法知道它们中的任何一个都应该有oopsd.前缀,因为父目录在sys.path.

如果要直接执行模块,请执行以下操作:

python -m oopsd.oopsd

这会将当前目录放入sys.path并确保源代码树的导入按您期望的那样工作。

Alex Z 的回答是错误的,因为它实际上并没有解决这个问题,而且它不是相对导入——Python 3 中不再存在隐式相对导入。

于 2014-05-22T03:18:39.820 回答
-2

这对我有用(驱动程序的相对路径):

import importlib
importlib.import_module('driver.optiups')

(评论中的karthikr很接近,但你似乎不需要领先.

于 2014-05-22T03:07:50.213 回答