我有一个python项目(projectA),我作为子文件夹在一个单独的项目(projectB)中作为git子模块包含在内。结构布局为
__init__.py
我正在尝试找出如何布置projectB_file.py
文件,以便Class1
我可以导入Class2
和from projectA.module1 import Class1
from projectA import Class2
raw_output = check_output('iw dev', shell=True)
答案 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