如何使用setup.py安装托管在私有PyPI中的包?

34

我正在为一个私人项目编写setup.py安装文件,其中包含公共和私有依赖项。公共的依赖项托管在PyPI上,而私有的依赖项则托管在运行simplepypi的服务器上。

我希望在安装期间能够解决并获取两种类型的依赖项。

因此,我将我的依赖项添加到了setup.py中:

setup(
    ...
    install_requires = [
        # public dependencies
        'argparse==1.2.1',
        'beautifulsoup4==4.1.3',
        'lxml==3.1.0',
        'mongoengine==0.8.2',
        'pymongo==2.5.2',
        'requests==1.1.0',
        'Cython==0.18',
        # private dependencies
        'myprivatepackage1',
        'myprivatepackage2'
    ],
    dependency_links=['http://pypi.myserver.com/packages'],
    ...
)

我使用命令 python setup.py sdist 构建软件包tarball,然后使用 pip install --verbose path/to/tarball.tar.gz在已激活的虚拟环境中安装它。

然而,pip日志中没有提到我的私有PyPI服务器,https://pypi.python.org/simple/似乎被查询了两次。

Running setup.py egg_info for package from file:///home/b/code/mapado/mypackage/dist/mypackage-0.5.1.tar.gz
    running egg_info
    creating pip-egg-info/mypackage.egg-info
    writing requirements to pip-egg-info/mypackage.egg-info/requires.txt
    writing pip-egg-info/mypackage.egg-info/PKG-INFO
    writing top-level names to pip-egg-info/mypackage.egg-info/top_level.txt
    writing dependency_links to pip-egg-info/mypackage.egg-info/dependency_links.txt
    writing manifest file 'pip-egg-info/mypackage.egg-info/SOURCES.txt'
    warning: manifest_maker: standard file '-c' not found
    
    reading manifest file 'pip-egg-info/mypackage.egg-info/SOURCES.txt'
    reading manifest template 'MANIFEST.in'
    writing manifest file 'pip-egg-info/mypackage.egg-info/SOURCES.txt'
Downloading/unpacking myprivatepackage (from mypackage==0.5.1)
  Could not fetch URL https://pypi.python.org/simple/myprivatepackage/: HTTP Error 404: Not Found (myprivatepackage does not have any releases)
  Will skip URL https://pypi.python.org/simple/myprivatepackage/ when looking for download links for myprivatepackage (from mypackage==0.5.1)
  Could not fetch URL https://pypi.python.org/simple/myprivatepackage/: HTTP Error 404: Not Found (myprivatepackage does not have any releases)
  Will skip URL https://pypi.python.org/simple/myprivatepackage/ when looking for download links for myprivatepackage (from mypackage==0.5.1)
  Could not find any downloads that satisfy the requirement myprivatepackage (from mypackage==0.5.1)
Cleaning up...

我错过了什么?

3个回答

22
看起来您没有像simplepy文档中所说的那样指定主机。您需要设置好您的~/.pypirc文件,将正确的主机名填写进去。请注意,不要删除任何HTML标签。

To use it run "simplepypi". You can upload packages by:

[...]

Not using twine yet? Here is the legacy way of uploading Python packages (not recommended):

Modify your ~/.pypirc so it looks like:

[distutils]
index-servers =
    pypi
    local

[local]
username: <whatever>
password: <doesn't matter, see above>
repository: http://127.0.0.1:8000

[pypi]
...
然后您将把您的软件包上传到上面。
python setup.py sdist upload -r local

并且可以从那里安装它

pip install -i http://127.0.0.1:8000/pypi <your favorite package>

希望这能有所帮助。


3
我修正了它!我的错误在于,正如你指出的那样,我需要将“http://127.0.0.1:8000/pypi/”网址添加到“dependency_links”中。 警告:它应该是“http://127.0.0.1:8000/pypi/”,而不是“http://127.0.0.1:8000/pypi”,因为后者会返回404错误。 - Balthazar Rouberol
3
我能否在不修改~/.pypirc的情况下完成这个操作?也就是说,只通过setup.py纯粹地完成它? - Thomas Ruble
因为问题涉及到setup.py,所以被投下了反对票。修改~/.pypirc对我来说不是一个选择。 - bfontaine

0

dependency_links默认情况下被忽略(至少在pip 9.0.1中)

为了让它能够连接到您的服务器,您需要添加--process-dependency-links

我认为pip 10将带来一个新机制,但目前这对我有用

我还必须更新dependency_links以包括包名称,例如:

dependency_links=[
    "http://internal-pyp:5678/simple/your_package_name"
]

0

您可以将您的包制作成普通的pip包并发布到私有仓库。要安装它,您可以在配置文件中指定全局选项--extra-index-url

$ cat ~/.pip/pip.conf
[global]
extra-index-url = https://...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接