如何在Python项目中正确组织文件

1 投票
4 回答
756 浏览
提问于 2025-04-17 13:00

我在用Python做项目时遇到了一些困难。这是关于第48题的内容,来自《艰难学Python》这本书。

让我困扰的代码行是测试文件lexicon_tests.py中的一部分:

from ex48 import lexicon

我看到的错误是:

ImportError: no module named ex48

我在想,这是不是因为我没有正确组织项目文件夹里的文件:我有一个名为ex48的文件夹,里面有两个子文件夹,分别是testslexicon。在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 个回答

1

这个错误提示你,ex48 这个文件夹不在你的 Python 导入搜索路径里。你可以通过以下方式来检查:

    import sys
    sys.path

补充说明

这里有一个逐步教程,教你如何把路径添加到 Python 的导入搜索路径中:设置 Windows Python 路径系统环境变量。我猜如果它们在 sys.path 中仍然没有出现,那说明你没有正确添加路径,直到它们出现之前,导入是无法正常工作的。

补充说明

现在说到你新的错误。当你执行 from ex48 import lexicon 时,以下其中一个条件必须成立,才能让它正常工作:

  1. ex48 文件夹里有一个名为 lexicon 的文件夹,并且 这两个 文件夹都包含一个 __init__.py 文件。

  2. lexicon.py 文件直接放在 ex48 文件夹里,并且 ex48 里也有一个 __init__.py 文件。

补充说明

你在最后评论中提到的错误是由于缩进不正确造成的。你上面发布的代码在 def scan(string): 下面的每一行都需要多一个缩进级别。

2

检查一下在 ex48 文件夹里是否有一个叫 __init__.py 的文件。这个文件是创建一个包所必需的,而且里面可以什么都不写。

1

为了让这个

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

撰写回答