安装不带父目录结构的python存储库
我有一个我继承的存储库,被很多团队使用,很多脚本称之为存储库,对它进行任何结构上的更改似乎都会让人头疼。我想让这个回购协议以某种方式安装。它的结构如下:安装不带父目录结构的python存储库,python,git,installation,setup.py,Python,Git,Installation,Setup.py,我有一个我继承的存储库,被很多团队使用,很多脚本称之为存储库,对它进行任何结构上的更改似乎都会让人头疼。我想让这个回购协议以某种方式安装。它的结构如下: my_repo/ scripts.py my_repo/ setup.py __init__.py scripts.py lib.py pkg/ __init__.py pkgmodule.py 如果它是我的存储库,我会像这样更改结构并使其可安装,然后运行pyt
my_repo/
scripts.py
my_repo/
setup.py
__init__.py
scripts.py
lib.py
pkg/
__init__.py
pkgmodule.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中添加一些内容,让它知道回购协议的结构很有趣,这样我就可以安装它了?您可以按照您的建议执行
my_repo/
setup.py
__init__.py
scripts.py
唯一的问题是,如果模块位于基本级别,则需要通过其名称导入包中的模块。例如,如果您的结构如下所示:
my_repo/
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中运行,并进行测试以确保名称空间不会混乱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”或“pip install”命令安装my_repo内容的人都会得到my_repo模块的已安装副本
作为旁注;在Python2和Python3中,相对导入的工作方式不同。在后者中,任何相对导入都需要明确指定这样做的意愿。当以绝对导入方式调用时,这种安装my_repo的方法将在python 3中工作:
from my_repo import scripts
谢谢假设我不在这个存储库中,这将允许我从我的_repo导入脚本中执行类似的操作,
;scripts.func1()代码>?不,python不知道my_repo名称空间。您必须执行导入脚本;scripts.func1()代码>这可以在my_repo/
之外完成吗?或者我需要与scripts.py位于同一目录中吗?