关于导入自定义程序包

时间:2018-04-22 03:48:18

标签: python python-3.x import

我的项目层次结构(Python 3.5):

/home/pavarine/Projects/brp   (project root)
   config.py
   main.py
   lib/
       Class1.py

我试图将我的项目(brp文件夹)动态转换为python包并从我想要的任何地方调用它的模块,如下所示:

执行' main.py':

sys.path.insert(0, "/home/pavarine/Projects/brp")
print('\n'.join(sys.path))

这让我:

/home/pavarine/Projects/brp
/home/pavarine/Projects/brp
/usr/lib/python35.zip
/usr/lib/python3.5
/usr/lib/python3.5/plat-x86_64-linux-gnu
/usr/lib/python3.5/lib-dynload
/home/pavarine/.local/lib/python3.5/site-packages
/usr/local/lib/python3.5/dist-packages
/usr/lib/python3/dist-packages

我可以清楚地看到我的项目根路径现在位于sys.path中,但是当我尝试导入" config.py"我收到了一个错误:

执行' main.py':

from brp import config

结果:

ImportError: No module named 'brp'

我做错了什么?

2 个答案:

答案 0 :(得分:3)

您需要将父目录插入到python路径中。

但是,请不要这样做。从脚本内部操作python路径可能很危险,使用绝对路径会使其无法移植。

对于您的项目,创建另一个名为brp的文件夹,并在那里创建一个简单的setup.py。 看起来应该是这样的

/home/pavarine/Projects/brp   (project root)
    setup.py
    brp/
       __init__.py # can be empty
       config.py
       main.py
       lib/
           __init__.py # can be empty
           Class1.py

首先,setup.py可以像

一样简单
from setuptools import setup, find_packages

setup(
    name='brp',
    packages=find_packages(),
)

然后,您可以从根文件夹安装包含pip install .的软件包,并在系统的任何位置使用它,而无需操作sys.path

如果需要,可以使用pips开发人员模式:pip install -e .,这只会创建符号链接,以便项目目录中的更改直接生效,而无需重新安装包。

答案 1 :(得分:1)

通常,您可以通过两种方式中的一种来构建项目。

根文件夹中有一个模块

brp/
    brp.py

或者您有多个模块放在一个子文件夹中:

mymod/
    mymod/
        __init__.py
        a.py
        b.py

最简单的解决方案是在现有brp中添加brp子文件夹,并移动该子文件夹中的所有内容。导致:

brp/
    brp/
        __init__.py
        config.py
        main.py
        lib/
             __init__.py
             Class1.py

__init__.py文件是如此python知道这些是子模块。有关详细信息,请参阅多个指南,包括此one