必发88官网 1

server搭建简单的PyPI源

pypiserver 是一个最基本的PyPI服务器实现, 可以用来上传和维护python包.
本文介绍 pypiserver
在Ubuntu上的基本安装,
配置和使用.

distutils、distutils2

distutils是 python
标准库的一部分,2000年发布。使用它能够进行 python 模块的
安装 和
发布。

distutils2 被设计为 distutils 的替代品,后来这个计划停滞了。

  1. 基本安装和使用

setuptools、easy_install、ez_setup.py

setuptools 是一个为了增强 distutils 而开发的集合,2004年发布。它包含了
easy_install 这个工具。

ez_setup.py 是 setuptools 的安装工具。ez 是 easy 的缩写。

使用方式:

  • 从 PyPI 上安装一个包:easy_install requests
  • 从网络文件安装(下载并安装):easy_install http://path/to/MyPackage-1.2.3.tgz
  • 从一个本地 .egg
    格式文件安装:easy_install /path/to/MyPackage-1.2.3.egg

distribute 是 setuptools 的一个分支版本,后来又合并到了setuptools。

1.1 安装和启动

pip

pip 是目前 python 包管理的事实标准,2008年发布。它被用作 easy_install
的替代品,但是它仍有大量的功能建立在 setuptools 组件之上。

pip 希望不再使用 Eggs 格式(虽然它支持
Eggs),而更希望采用“源码发行版”(使用 python setup.py sdist 创建)。

pip使用方式:

  • pip 可以利用 requirments.txt 来实现依赖的安装。
  • 支持 git/svn/hg 等流行的 VCS 系统,可以直接从 gz 或者 zip
    压缩包安装,支持搜索包,以及指定服务器安装等等功能。
  • pip 提供了一个 wheel 子命令来安装 wheel 包。需要先安装 wheel 模块。

pypiserver 可以在Python 2或者Python 3下运行. 使用pip就可以安装:
pip install pypiserver

setup.py vs requirements.txt ¶

  • Python库:那些被开发并且为了其他人来使用而发布的东西,你可以在 PyPI
    找到很多Python库。为了更好的推广和传播
    自己,Python库会包含很多的信息,比如它的名字,版本号,依赖等等。而
    setup.py
    就是用来提供这些信息的。但是,并没有规定你可以从哪里获取这些依赖库。
  • Python应用:指你所要部署的一些东西,这是区别于我们之前所讲的Python库的。一个应用经常会有很多依赖,或许会很复杂。这些依赖里很多没有一个名字,或者没有我们说所的那些信息。这便反映了
    pip
    的requirements文件所做的事情了。每个依赖都标明了准确的版本号,一般一个Python库对依赖的版本比较宽松,而一个应用則会依赖比较具体的版本号。虽然也许跑其他
    版本的 requests
    并不会出错,但是我们在本地测试顺利后,我们就会希望在线上也跑相同的版本。执行pip install -r requirements.txt来安装。

setup.py

from setuptools import setup

setup(
    name="MyLibrary",
    version="1.0",
    install_requires=[
        "requests",
        "bcrypt",
    ],
    # ...
)

requirements.txt

# This is an implicit value, here for clarity
--index https://pypi.python.org/simple/

MyPackage==1.0
requests==1.2.0
bcrypt==1.0.2

启动 pypiserver 使用以下命令:
pypi-server

从抽象到具体

上面这个requirements.txt文件的头部有一个
--index https://pypi.python.org/simple/
,一般如果你不用声明这项,除非你使用的不是PyPI。然而它却是
requirements.txt 的一个重要部分, 这一行把一个抽象的依赖声明
requests==1.2.0 转变为一个具体的依赖声明
requests 1.2.0 from pypi.python.org/simple/

setup.py 中,也存在一个 install_requires
表来指定依赖的安装。这一功能除去了依赖的抽象特性,直接把依赖的获取url标在了setup.py里。Link

from setuptools import setup

setup(
    # ...
    dependency_links = [
        "http://packages.example.com/snapshots/",
        "http://example2.com/p/bar-1.0.tar.gz",
    ],
)

在没有显示指定任何启动参数的时候, pypiserver 是使用 ~/packages
来保存Python包, 同时监听8080端口来提供PyPI服务.

wheel

wheel 本质上是一个 zip 包格式,它使用 .whl 扩展名,用于 python
模块的安装,它的出现是为了替代 Eggs。

wheel 还提供了一个 bdist_wheel 作为 setuptools
的扩展命令,这个命令可以用来生成 wheel 包。

pip 提供了一个 wheel 子命令来安装 wheel 包。

setup.cfg 可以用来定义 wheel 打包时候的相关信息。

Python Wheels 网站展示了使用 Wheels 发行的
python 模块在 PyPI 上的占有率。

.whl文件下载:

1.2 上传Python包

总结

安装

  • Use pip to install Python packages from PyPI. Depending how pip is
    installed, you may need to also install wheel to get the benefit of
    wheel caching.
  • Use virtualenv, or pyvenv to isolate application specific
    dependencies from a shared Python installation.
  • If you’re looking for management of fully integrated cross-platform
    software stacks, consider buildout (primarily focused on the web
    development community) or Hashdist, or conda (both primarily focused
    on the scientific community).

打包

  • Use setuptools to define projects and create Source Distributions.
  • Use the bdist_wheel setuptools extension available from the wheel
    project to create wheels. This is especially beneficial, if your
    project contains binary extensions.
  • Use twine for uploading distributions to PyPI.

此时, 在创建 ~/packages 目录后, 可以将Python包上传到此目录下. 比如,
有一个Python项目叫 demo , 它的 setup.py 文件内容如下:
from setuptools import setup

第三方库安装路径

Debian系的特殊路径:Link

dist-packages instead of site-packages. Third party Python software
installed from Debian packages goes into dist-packages, not
site-packages. This is to reduce conflict between the system Python,
and any from-source Python build you might install manually.

就是说从源代码手动安装,将使用site-packages目录。第三方python软件安装到dist-packages必发88官网,目录,这是为了减少与操作系统版本的python的冲突,因为Debian系统的许多工具都依赖与系统版本的python。

setup(
    name=’demo’,
    version=’0.0.1′,
    packages=[‘demo’]
)

查找 Python 安装路径

>>> from distutils.sysconfig import get_python_lib
>>> print(get_python_lib())

在项目根目录下执行以下命令来生成Python代码分发包:
python setup.py sdist

Links

执行完上面这条命令后, 可以在项目下的 dist 目录找到分发包
demo-0.0.1.tar.gz. 将分发包上传到 ~/packages 目录下, 接下来就可以访问
pypiserver 上的Python包了.

必发88官网 1

1.3 安装 pypiserver 上的Python包

在安装和启动 pypiserver 后,
可以通过浏览器访问 pypiserver 的默认欢迎页:

访问

1.3.1 pip

在本地环境中, 可以使用 pip 的 index-url 参数来访问 pypiserver
上的Python包:
# pip search -i demo
# pip install -i demo

1.3.2 easy_install

同样也可以使用 easy_install 来访问 pypiserver :
# easy_install -i demo

  1. 远程上传项目包

如果希望通过python setup.py upload命令将本地项目代码上传到PyPI服务器,
可以通过以下步骤来完成.

2.1 无密码上传项目包

默认情况下, pypiserver 的上传操作是密码保护的,
不过可以通过以下启动参数来关闭密码保护:
pypi-server -P . -a .

上述命令中的-P参数用来指定密码文件, -a用来指定需要密码保护的操作.
当这两个参数同时指定为.时, 表示所有的操作都不需要密码保护.

此时, 就可以在Python项目的根目录下, 执行远程安装命令来上传包.
比如在本地项目中, 执行以下命令:
python setup.py sdist upload -r

此时, upload 命令仍然会提示输入密码, 此时直接回车确认就可以了.

2.2 使用密码保护PyPI源

当希望使用密码来控制Python包的上传操作的时候, 需要使用Apache htpasswd
文件.

pypiserver 需要 passlib 包来读取 htpasswd 文件. 使用以下命令来安装
passlib :
pip install passlib

要生成 htpasswd 文件, 需要安装 apache2-utils 工具包.
在Ubuntu上使用以下命令安装:
apt-get install -y apache2-utils

接下来就可以用 htpasswd 命令来生成密码文件. 假设密码文件路径为
/root/.pypipasswd , 第一次生成密码文件的命令如下:
htpasswd -c /root/.pypipasswd sam

上述命令中的最后一个参数sam是用户名, 执行命令后, 会提示输入密码.

当需要在已有的密码文件中添加新的用户名和密码时, 不能再使用-c参数,
否则会将已有的数据覆盖. 比如, 要在上一步生成的文件里添加一个新用户名
john :
htpasswd /root/.pypipasswd john

接下来就可以使用密码文件来控制上传操作了. 当启动 pypiserver 时,
通过-P参数来指定所要使用的密码文件. 默认情况下, 上传操作会需要密码验证,
如果希望其他操作也需要密码验证, 可以使用-a参数.
具体-a参数的使用可以查阅_pypiserver_的启动命令帮助, 这里不再展开.
pypi-server -P /root/.pypipasswd

接下来, 在需要上传Python包的系统中,
需要配置Distutils来指定上传操作所需要的用户名和密码.

创建或者修改 ~/.pypirc 文件, 文件需要以下内容:
[distutils]
index-servers = localhost

[localhost]
repository:
username: sam
password: 123456

配置中的[localhost] section就是 pypiserver 的地址和用户名密码信息.
index-servers值中的localhost就指定了名为localhost的section. 接下来,
当我们向名为 localhost 或者地址为
的PyPI源上传Python包时, 用户名 sam 和密码 123456
就会被用来验证操作权限:
python setup.py sdist upload -r localhost

  1. 其他配置

3.1 指定监听端口

默认情况下 pypiserver 监听8080端口,
我们可以通过-p参数来指定期望的端口:
pypi-server -p 9090

3.2 指定包目录

默认情况下 pypiserver 使用_~/packages_ 目录来读取和保存Python包.
我们可以使用-P参数来修改:
pypi-server -P /opt/pypiserver/packages

3.3 请求转发

当请求的Python包, 在本地 pypiserver 上没有找到时,
它会将请求转发到外部PyPI源, 默认为 .
对于国内使用来说, 可以通过 –fallback-url
参数将转发目的地址设置为豆瓣源:
pypi-server –fallback-url

本文永久更新链接地址

必发88官网 2