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.md
3. 编辑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.md
6.(可选)添加LICENSE.txt
或信息到README.md
。这是很好的文档实践,如果您计划将Python包上传到公共PyPI存储库,这将非常有用。
7. Python包需要先压缩,然后才能在服务器上下载。压缩包:
python setup.py sdist
一个tar.gz文件将生成在~/linode_example/dist/
中。
接下来,设置服务器以托管包索引。本指南将使用pypiserver
,它是一个基于Bottle框架的包装器,它使得在服务器上设置包索引变得更加容易。
1. 安装virtualenv(如果尚未安装的话):
pip install virtualenv
2. 创建一个新目录,用于保存Python包以及Apache使用的文件。在此目录中创建一个名为venv
的新的虚拟环境,然后激活它:
mkdir ~/packages cd packages virtualenv venv source venv/bin/activate
3. 在新创建的虚拟环境中通过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 ~/packages
6. 现在,服务器就在侦听所有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 passlib
2. 使用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 wsgi
4. 在~/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.conf
8. 重启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.0
2. 安装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
。
有关此主题的其他信息,您可能需要参考以下资源。虽然提供这些是希望它们有所帮助,但请注意,我们无法保证外部托管材料的准确性或及时性。