我是一名有用的助手,可以为您翻译文本。
我在使用Python unittest时遇到了一个奇怪的错误。我的项目中有两个文件夹:
我在使用Python unittest时遇到了一个奇怪的错误。我的项目中有两个文件夹:
project
code
__init__.py (empty)
app.py (defines my App class)
test
test.py (contains my unit tests)
test.py是:
import os, sys, unittest
sys.path.insert(1, os.path.join(sys.path[0],'..'))
from code.app import App
class test_func1(unittest.TestCase):
...
当我运行test.py时,我收到以下消息:
Traceback (most recent call last):
File "<frozen importlib._bootstrap>", line 2218, 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 "...test.py, line 5, in <module>
from code.app import App
ImportError: No module named 'code.app': 'code' is not a package
在确认了__init__.py
文件的存在并且苦思冥想了一段时间后,我突发奇想将应用程序目录的名称从code
改为prog
:
import os, sys, unittest
sys.path.insert(1, os.path.join(sys.path[0],'..'))
from prog.app import App
...然后一切都好了。Unittest成功导入我的应用程序并运行了测试。
我在https://docs.python.org/3.5/reference/lexical_analysis.html#keywords和https://docs.python.org/3/reference/import.html#path-entry-finders中搜索过,没有发现code
是非法的目录名称。这个会在哪里有记录,并且还有哪些目录名称是保留的?
系统:python 3.4.3 [MSC v1600 32 bit] on win32, Windows 7
code
并不是Python中的保留名称,但标准库中有一个名为code
的现有模块,因此给你的模块命名为code
是一个糟糕的想法,就像将列表命名为list
一样。根据您提供的信息,我预计您的模块会与内置模块产生命名冲突,但实际情况可能有多种可能性。 - user2357112__init__.py
中定义的内容,您应该执行from code import app
。如果app
在__init__.py
中定义,则可以尝试执行from code.app ...
,如果是这样,请忽略我的评论。 - Torxedfrom prog import app
,然后在脚本中使用限定的app.App
。这不需要在__init__.py
中添加任何内容,但仅在您想要导入和使用两个都定义了App
的不同模块时才需要。 - Dave