在Pythonic库设计中导入正确的包?

2024-04-25 20:37:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python项目,结构如下:

repo_dir/
----project_package/
--------__init__.py
--------process.py
--------config.py
----tests/
--------test_process.py

__init__.py为空

config.py看起来像这样:

name = 'brian'

用法

我通过从project/project/目录运行python process.py,或者通过指定python文件路径来使用库。我在amazonec2linux上运行python2.7。你知道吗

process.py如下所示时,一切正常,process.py打印brian。你知道吗

import config
print config.name

process.py如下所示时,我得到错误ImportError: No module named project.config。你知道吗

import project.config
print config.name

process.py如下所示时,我得到错误ImportError: No module named project。这是有意义的,因为前面的示例中的行为应该是相同的。你知道吗

from project import config
print config.name

如果我将这些行添加到process.py以将库根包含在sys.path,那么上面的所有配置都可以正常工作。你知道吗

import os
import sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

我的困惑

许多参考资料建议设置python库来使用project.module_name导入模块,但是sys.path附加似乎不是标准的,而且我需要它似乎很奇怪。我看得出来系统路径append将我的库根添加为sys中的路径,但我认为这就是我的库根中的__init__.py应该做的。有什么好处?我错过了什么?我知道Python导入会带来很多麻烦,所以我试着尽可能地简化这个过程,让我的头脑围绕着它。我快疯了,今天是放假前的星期五。我很沮丧。请帮忙!!你知道吗

问题

我应该如何设置我的库?我应该如何导入包?我应该在哪里有__init__.py文件?我需要将我的库根附加到系统路径在每个项目中?为什么这么混乱?你知道吗


Tags: path项目namepyimport路径projectconfig
2条回答

我认为问题在于你如何运行你的脚本。如果希望脚本位于包(内部project文件夹)中,则应使用python -m project.process而不是按文件名运行它。然后可以进行绝对或显式的相对导入,以从process获取config。你知道吗

绝对导入将是from project import configimport project.config。你知道吗

显式的相对导入是from . import config。你知道吗

python2也允许隐式的相对导入,但是它们是一个非常糟糕的错误特性,您永远不应该使用它。通过隐式相对导入,内部包模块可以隐藏顶级模块。例如,project/json.py文件会对包中的所有其他模块隐藏标准库的json模块。您可以通过将from __future__ import absolute_import放在文件的顶部来告诉Python您想要禁止隐式的相对导入。这是python3中的标准行为。你知道吗

项目设置正常。为了清楚起见,我重新命名了目录 在本例中,结构与您的相同:

repo_dir/

    project_package/
        __init__.py
        process.py
        config.py

    # Declare your project in a setup.py file, so that
    # it will be installable, both by users and by you.
    setup.py

当您有一个模块要从中的另一个模块导入时 同样的项目,最好的方法是使用相对进口。例如:

# In process.py
from .config import name

...

在dev box上编写代码时,在Python virtualenv中进行工作, 在“可编辑”模式下安装项目。你知道吗

# From the root of your repo:
pip install -e .

使用这种方法,您将永远不需要在sys.path中混日子 几乎总是错误的方法。你知道吗

相关问题 更多 >

    热门问题