我有一个我继承的存储库,很多团队都使用它,很多脚本都会调用它,而且对它进行任何结构性修改似乎都是一件非常令人头痛的问题。我想以某种方式安装这个repo。它的结构如下:
my_repo/
scripts.py
如果是我的存储库,我会像这样更改结构并使其可安装,并运行python setup.py install
:
my_repo/
setup.py
my_repo/
__init__.py
scripts.py
如果这不可行(听起来可能不是这样),我可以做某事:
my_repo/
setup.py
__init__.py
scripts.py
并在setup.py中添加一些内容,让它知道repo结构有趣,这样我可以安装它吗?
答案 0 :(得分:1)
你可以做你的建议。
my_repo/
setup.py
__init__.py
scripts.py
唯一的事情是,如果它们位于基础级别,您将需要通过其名称导入包中的模块。例如,如果你的结构看起来像这样:
my_repo/
setup.py
__init__.py
scripts.py
lib.py
pkg/
__init__.py
pkgmodule.py
然后您在scripts.py中的导入可能看起来像
from lib import func1, func2
from pkg.pkgmodule import stuff1, stuff2
因此,在您的基本目录中,导入主要是按模块名称而不是按包。如果你不小心,这可能会搞砸你的其他一些软件包名称空间,比如是否存在另一个名为lib
的软件包的依赖项。因此,最好是让这些脚本在virtualenv中运行,如果你进行测试以确保命名空间不会搞砸
答案 1 :(得分:1)
setup.py文件中有一个指令,用于设置要安装的软件包的名称,以及从哪里获取要安装的模块。这将允许您使用所需的目录结构。例如,使用给定的目录结构:
my_repo/
setup.py
__init__.py
scripts.py
您可以编写一个setup.py,例如:
setup(
# -- Package structure ----
packages=['my_repo'],
package_dir={'my_repo': '.'})
因此,使用命令" ./ setup.py install"安装my_repo内容的任何人或者" pip install。"最终将安装my_repo模块的安装副本。
作为旁注;相对导入在python 2和python 3中的工作方式不同。在后者中,任何相对导入都需要明确指定这样做的意愿。当以绝对导入方式调用时,这种安装my_repo的方法将在python 3中起作用:
from my_repo import scripts