如何在Python项目中正确组织文件
我在用Python做项目时遇到了一些困难。这是关于第48题的内容,来自《艰难学Python》这本书。
让我困扰的代码行是测试文件lexicon_tests.py
中的一部分:
from ex48 import lexicon
我看到的错误是:
ImportError: no module named ex48
我在想,这是不是因为我没有正确组织项目文件夹里的文件:我有一个名为ex48
的文件夹,里面有两个子文件夹,分别是tests
和lexicon
。在lexicon
文件夹里,我有一个文件叫lexicon.py
,而在tests
文件夹里,我有一个文件叫lexicon_tests.py
。
这样的组织方式有没有问题呢?
补充一下:我在这里贴出代码 -
在/ex48文件夹里,我有setup.py
try:
from setuptools import setup
except ImportError:
from distutils.core import setup
config = {
'description': 'My Project',
'author': 'MyName',
'url': 'URL to get it at.',
'download_url': 'Where to download it.',
'author_email': 'My email.',
'version': '0.1',
'install_requires': ['nose'],
'packages': ['ex48'],
'scripts': [],
'name': 'projectname'
}
setup(**config)
在/ex48/lexicon文件夹里,我有lexicon.py
class lexicon:
@staticmethod
def scan(string):
direction = ['north', 'south', 'east', 'west', 'down', 'up', 'left', 'right', 'back']
verbs = ['go','stop','kill','eat']
stop = ['the','in', 'of', 'from', 'at','it']
nouns = ['door', 'bear', 'princess', 'cabinet']
words = string.split()
result = []
for word in words:
if word in direction:
result.append(('direction',word))
等等……最后有return result
。所有的环境变量都已经正确添加。现在我看到的错误是ImportError
,提示找不到名为lexicon的模块。
4 个回答
这个错误提示你,ex48 这个文件夹不在你的 Python 导入搜索路径里。你可以通过以下方式来检查:
import sys
sys.path
补充说明
这里有一个逐步教程,教你如何把路径添加到 Python 的导入搜索路径中:设置 Windows Python 路径系统环境变量。我猜如果它们在 sys.path
中仍然没有出现,那说明你没有正确添加路径,直到它们出现之前,导入是无法正常工作的。
补充说明
现在说到你新的错误。当你执行 from ex48 import lexicon
时,以下其中一个条件必须成立,才能让它正常工作:
在
ex48
文件夹里有一个名为lexicon
的文件夹,并且 这两个 文件夹都包含一个__init__.py
文件。lexicon.py
文件直接放在ex48
文件夹里,并且ex48
里也有一个__init__.py
文件。
补充说明
你在最后评论中提到的错误是由于缩进不正确造成的。你上面发布的代码在 def scan(string):
下面的每一行都需要多一个缩进级别。
检查一下在 ex48 文件夹里是否有一个叫 __init__.py
的文件。这个文件是创建一个包所必需的,而且里面可以什么都不写。
为了让这个
from ex48 import lexicon
result = lexicon.scan("north south east")
正常工作,你需要把 lexicon.py
文件放在 ex48
文件夹里,并且 lexicon.py
里要有一个 scan
函数,这个函数要在模块的顶层定义,而不是作为类的方法。
根据你现在的代码,你在 lexicon
包里的 lexicon
模块中有一个 lexicon
类,那么导入这个模块的语句应该像这样写
from ex48.lexicon.lexicon import lexicon