
Python中的包管理可通过各种不同的工具获得:
Pip仍然是最受欢迎的选项之一,因为它几乎不用你手动来安装和更新软件包到操作系统。Pip可管理完整的包列表及其相应的版本号,在不同的独立环境中促进整个包组的精确复制。pip install package来安装。本指南将Python包的基础脚手架分解,然后再使用PyPiServer,通过将包上传到Linode来创建私有存储库。pip与setuptools的工作装置。从Python 3.4开始,默认安装附带pip。在Debian发行版上,pip可以使用sudo apt install python-pip的apt包管理器进行安装。Python包的基本脚手架是一个包含与用户交互的代码的__init__.py文件。
1. 使用您想取的包名创建一个目录。本指南将会使用linode_example。
mkdir linode_example注意 如果您选择要让您的包公开化,则需要考虑其他因素来决定包的名称。官方文件建议仅使用小写字符(PyPI独有),并使用下划线字符分隔单词(如果需要的话)。
2. 导航到新创建的目录。创建一个名为setup.py的文件和另一个名为linode_example的目录,其中包含含__init__.py。目录树应如下所示:
linode_example/
linode_example/
__init__.py
setup.py
setup.cfg
README.md3. 编辑setup.py以包含有关您的Python包的基本信息:
linode_example / setup.py
from setuptools import setup
setup(
name='linode_example',
packages=['linode_example'],
description='Hello world enterprise edition',
version='0.1',
url='http://github.com/example/linode_example',
author='Linode'
author_email='docs@linode.com'
keywords=['pip','linode','example']
)4. 添加示例函数到__init__.py:
linode_example / linode_example / __ init__.py
def hello_word():
print("hello world")5. 该setup.cfg文件使PyPI知道README文件是一个markdown文件:
setup.cfg
[metadata]
description-file = README.md6.(可选)添加LICENSE.txt或信息到README.md。这是很好的文档实践,如果您计划将Python包上传到公共PyPI存储库,这将非常有用。
7. Python包需要先压缩,然后才能在服务器上下载。压缩包:
python setup.py sdist一个tar.gz文件将生成在~/linode_example/dist/中。
接下来,设置服务器以托管包索引。本指南将使用pypiserver,它是一个基于Bottle框架的包装器,它使得在服务器上设置包索引变得更加容易。
1. 安装virtualenv(如果尚未安装的话):
pip install virtualenv2. 创建一个新目录,用于保存Python包以及Apache使用的文件。在此目录中创建一个名为venv的新的虚拟环境,然后激活它:
mkdir ~/packages cd packages virtualenv venv source venv/bin/activate3. 在新创建的虚拟环境中通过pip下载程序包:
pip install pypiserver注意 除此之外,从Github下载pypiserver,然后导航到下载的pypiserver目录并安装python setup.py install也可以。
4. 将linode_example-0.1.tar.gz移动到~/packages:
mv ~/linode_example/dist/linode_example-0.1.tar.gz ~/packages/5. 运行以下命令试验服务器:
pypi-server -p 8080 ~/packages6. 现在,服务器就在侦听所有IP地址。在Web浏览器中,导航到192.0.2.0:8080,您的Linode的公共IP地址则是在192.0.2.0。浏览器应显示:

您现在可以通过声明外部URL pip install --extra-index-url http://192.0.2.0:8080/simple/ --trusted-host 192.0.2.0 linode_example来安装linode_example包。
1. 为上传安装Apache和passlib基于密码的验证。请确保您仍处于已激活的虚拟环境中((venv)应出现在终端提示符之前),然后执行以下操作:
sudo apt install apache2
pip install passlib2. 使用htpasswd创建用于身份验证的密码并将htpasswd.txt移入~/packages目录。输入所需的密码两次:
htpasswd -sc htpasswd.txt example_user
New password:
Re-type new password:3. 安装并启用mod_wsgi以允许Bottle(一个WSGI框架)与Apache的连接:
sudo apt install libapache2-mod-wsgi sudo a2enmod wsgi4. 在~/packages的目录中,创建一个pypiserver.wsgi的文件,创建一个应用程序对象,以便在pypiserver和Apache之间进行连接:
packages/pypiserver.wsgi
import pypiserver
PACKAGES = '/absolute/path/to/packages'
HTPASSWD = '/absolute/path/to/htpasswd.txt'
application = pypiserver.app(root=PACKAGES, redirect_to_fallback=True, password_file=HTPASSWD)5. 为位于/etc/apache2/sites-available/位置的pypiserver创建配置文件:
/etc/apache2/sites-available/pypiserver.conf
<VirtualHost *:80>
WSGIPassAuthorization On
WSGIScriptAlias / /absolute/path/to/packages/pypiserver.wsgi
WSGIDaemonProcess pypiserver python-path=/absolute/path/to/packages:/absolute/path/to/packages/venv/lib/pythonX.X/site-packages
LogLevel info
<Directory /absolute/path/to/packages>
WSGIProcessGroup pypiserver
WSGIApplicationGroup %{GLOBAL}
Require ip 203.0.113.0
</Directory>
</VirtualHost>该Require ip 203.0.113.0指令是限制对Apache的访问的示例IP。若要授予开放访问权限,请将其替换为Require all granted。有关更复杂的访问控制规则,请参阅Apache文档中的访问控制。
注意 根据Python的版本和虚拟环境路径的不同,该WSGIDaemonProcess指令可能需要不同的路径。
6. 为用户www-data提供~/packages目录的所有权。这将允许使用setuptools的方式从客户端上传:
sudo chown -R www-data:www-data packages/7. 如果需要,请禁用默认站点并启用pypiserver:
sudo a2dissite 000-default.conf
sudo a2ensite pypiserver.conf8. 重启Apache:
sudo service apache2 restart默认情况下,应该可以在端口80上通过192.0.2.0访问存储库,其中192.0.2.0是Linode的公共端口。
回想一下刚才声明的相当长的标志pip,以便可以从指定的存储库下载。然后创建一个包含公共服务器IP的配置文件可以让使用更简便。
1. 在客户端计算机上,在主目录中创建一个.pip目录。在此目录中,使用以下内容创建pip.conf:
pip.conf
[global]
extra-index-url = http://192.0.2.0:8080/
trusted-host = 192.0.2.02. 安装linode_example包:
pip install linode_example注意 终端输出和显示所有包如用pip list都会显示包名中的下划线已转换为破折号。这是因为setuptools已使用safe_name的实用程序。有关此问题的深入讨论,请参阅此邮件列表主题。
3. 打开Python shell并试用新的包:
>>from linode_example import hello_world
>>hello_world()
hello world虽然可以使用scp将tar.gz的文件传送到存储库,但还有其他工具如twine和easy_install也可以使用。
1. 在客户端计算机上,在名为.pypirc的主目录中创建新配置文件,将调用远程存储库linode:
.pypirc
[distutils]
index-servers =
pypi
linode
[pypi]
username:
password:
[linode]
repository: http://192.0.2.0
username: example_user
password: mypassword上传到官方Python包索引是需要一个帐户的,尽管帐户信息字段可以留空。可以将example_user和mypassword 替换为之前定义的认证信息htpasswd。
2. 从Python包的目录上传:
python setup.py sdist upload -r linode若成功,控制台将打印出这条消息:Server Response (200): OK。
有关此主题的其他信息,您可能需要参考以下资源。虽然提供这些是希望它们有所帮助,但请注意,我们无法保证外部托管材料的准确性或及时性。