使用__init__.py导入Python包的目录结构

时间:2016-01-13 22:51:03

标签: python python-import

我有一个python项目(projectA),我作为子文件夹在一个单独的项目(projectB)中作为git子模块包含在内。结构布局为

__init__.py

我正在尝试找出如何布置projectB_file.py文件,以便Class1我可以导入Class2from projectA.module1 import Class1 from projectA import Class2

raw_output = check_output('iw dev', shell=True)

3 个答案:

答案 0 :(得分:1)

我认为拥有导入的顶级projectA部分将是一个错误。这将要求您编写带有projectA重复的导入(例如import projectA.projectA.module1.file1)。

相反,您应该以某种方式将顶级projectA文件夹添加到模块搜索路径(作为projectB的安装脚本的一部分,或者使用IDE中的设置)。这样,projectA作为顶级名称将引用内部文件夹,您实际上打算将其作为projectA包。

答案 1 :(得分:0)

在每个要作为包处理的子目录中,您需要__init__.py。在你的情况下,这意味着一个:

  • projectA
  • projectA/projectA
  • projectA/projectA/module1
  • projectA/projectA/tests

肯定会丢失第一个projectA文件夹。

答案 2 :(得分:0)

这是一个恼人的问题。我使用的主要方法是编辑PYTHONPATH。这基本上就是我这样做的。

ProjectB/                   # Main Repository
    projectb/               # Package/library
        __init__.py
        projectB_file.py
    docs/
    tests/
    setup.py                # Setup file to distribute the library
    freeze.py               # CX_Freeze file to make executables

    ProjectA/               # Subrepository
        projecta/           # Package/library
            __init__.py
            projectA_file.py
            file2.py
            submodule/
                __init__.py
                file3.py
        pa_module1/         # Additional package/library in 1 project
            __init__.py
            file1.py
        docs/
        tests/
        setup.py

使用此设置,我必须在运行ProjectB的代码之前编辑python路径。我使用这种结构,因为它更容易部署和分发。子存储库有助于跟踪ProjectB的每个版本的ProjectA版本。

cd ProjectB
export PYTHONPATH=${PWD}:${PWD}/ProjectA
python projectb/projectB_file.py

projectB_file.py

from projecta import projectA_file

这适用于我的开发环境。对于发布环境,有人会使用以下代码进行安装。

# Need a correct setup.py to handle 2 packages for pa_module1 and projecta
pip install ProjectA (install projecta to site-packages) 
cd ..
pip install ProjectB (install projectb to site-packages)

这意味着projectb和projecta位于站点包中。从那里任何文件都可以简单地

from projectb import projectB_file
from projecta import projectA_file, file2
from pa_module1 import file1

# Personally I don't like imports that use project.sub.sub.sub ...
# I have seen it cause import confusion and problems, but it is useful in some situations.
from projecta.submodule import file3

#import projecta.projectA_file
#import projecta # if __init__.py has import code

file1.Class1()
file2.Class2()
file3.Class3()

另外,使用pip,您可以将库安装为开发人员环境,该环境链接到实际项目目录,而不是将文件复制到site-packages。

pip install -e ProjectA