Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
安装不带父目录结构的python存储库_Python_Git_Installation_Setup.py - Fatal编程技术网

安装不带父目录结构的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位于同一目录中吗?