The*_*ler 7 python python-import python-3.x
我正在尝试以编程方式导入子模块.我的文件树看起来像这样:
oopsd/__init__.py
oopsd/oopsd.py
oopsd/driver/__init__.py
oopsd/driver/optiups.py
Run Code Online (Sandbox Code Playgroud)
optiups.py只打印"Hello World".
oopsd.py看起来像这样:
import importlib
importlib.import_module('oopsd.driver.optiups')
Run Code Online (Sandbox Code Playgroud)
现在有了这个,我得到了这个例外:
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
Run Code Online (Sandbox Code Playgroud)
__path__甚至在Python 3中是否仍然存在?
我也试过导入.driver.optiups,但这会产生:
TypeError: relative imports require the 'package' argument
Run Code Online (Sandbox Code Playgroud)
__package__ 似乎没有设置,所以我迷路了.
我该怎么做正确的方法?
Eev*_*vee 20
这是一个老问题,但由于它被撞了,另一个答案是完全错误的,这是一个常见的问题:
你可能正在这样做.
python oopsd/oopsd.py
Run Code Online (Sandbox Code Playgroud)
不要这样做.:)
具体来说,永远不要尝试直接运行父包的一部分文件.运行时python FILENAME,Python会将包含目录的文件添加到sys.path,并且不会添加当前目录.所以你已经走oopsd/在了自己的道路上,而每个模块都oopsd/成了顶级模块.Python甚至不知道它们中的任何一个应该有oopsd.前缀,因为父目录不存在于任何地方sys.path.
如果要直接执行模块,请执行以下操作:
python -m oopsd.oopsd
Run Code Online (Sandbox Code Playgroud)
这会将当前目录放入sys.path并确保源树的导入按预期工作.
Alex Z的答案是错误的,因为它实际上并没有解决这个问题,而且它不是相对导入 - Python 3中不再存在隐式相对导入.
| 归档时间: |
|
| 查看次数: |
13911 次 |
| 最近记录: |