前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何创建私有Python包存储库

如何创建私有Python包存储库

作者头像
良莉
发布2018-09-03 14:18:43
4.4K0
发布2018-09-03 14:18:43
举报
文章被收录于专栏:最新技术

Python是如何处理包管理的?

Python中的包管理可通过各种不同的工具获得:

  • Pip仍然是最受欢迎的选项之一,因为它几乎不用你手动来安装和更新软件包到操作系统。Pip可管理完整的包列表及其相应的版本号,在不同的独立环境中促进整个包组的精确复制。
  • PyPI(Python包索引)是一个用户提交的包公共存储库,它可以用pip install package来安装。本指南将Python包的基础脚手架分解,然后再使用PyPiServer,通过将包上传到Linode来创建私有存储库。

在您开始之前

  1. 请熟知我们的入门指南并完成设置Linode时区的步骤。
  2. 本指南假定使用 Python 3,pipsetuptools的工作装置。从Python 3.4开始,默认安装附带pip。在Debian发行版上,pip可以使用sudo apt install python-pip的apt包管理器进行安装。
  3. 本指南中使用Apache 2.4。较旧的版本可能缺少相同的指令,并且配置略有不同。

极简主义Python包

Python包的基本脚手架是一个包含与用户交互的代码的__init__.py文件。

1. 使用您想取的包名创建一个目录。本指南将会使用linode_example。

代码语言:javascript
复制
mkdir linode_example

注意 如果您选择要让您的包公开化,则需要考虑其他因素来决定包的名称。官方文件建议仅使用小写字符(PyPI独有),并使用下划线字符分隔单词(如果需要的话)。

2. 导航到新创建的目录。创建一个名为setup.py的文件和另一个名为linode_example的目录,其中包含含__init__.py。目录树应如下所示:

代码语言:python
代码运行次数:0
复制
linode_example/ 
linode_example/
 __init__.py 
setup.py 
setup.cfg 
README.md

3. 编辑setup.py以包含有关您的Python包的基本信息: linode_example / setup.py

代码语言:python
代码运行次数:0
复制
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

代码语言:python
代码运行次数:0
复制
def hello_word():
     print("hello world")

5. 该setup.cfg文件使PyPI知道README文件是一个markdown文件:

setup.cfg

代码语言:javascript
复制
[metadata]
description-file = README.md

6.(可选)添加LICENSE.txt或信息到README.md。这是很好的文档实践,如果您计划将Python包上传到公共PyPI存储库,这将非常有用。

7. Python包需要先压缩,然后才能在服务器上下载。压缩包:

代码语言:javascript
复制
python setup.py sdist

一个tar.gz文件将生成在~/linode_example/dist/中。

安装PyPI服务器

接下来,设置服务器以托管包索引。本指南将使用pypiserver,它是一个基于Bottle框架的包装器,它使得在服务器上设置包索引变得更加容易。

1. 安装virtualenv(如果尚未安装的话):

代码语言:javascript
复制
pip install virtualenv

2. 创建一个新目录,用于保存Python包以及Apache使用的文件。在此目录中创建一个名为venv的新的虚拟环境,然后激活它:

代码语言:javascript
复制
mkdir ~/packages cd packages virtualenv venv source venv/bin/activate

3. 在新创建的虚拟环境中通过pip下载程序包:

代码语言:javascript
复制
pip install pypiserver

注意 除此之外,从Github下载pypiserver,然后导航到下载的pypiserver目录并安装python setup.py install也可以。

4. 将linode_example-0.1.tar.gz移动到~/packages

代码语言:javascript
复制
mv ~/linode_example/dist/linode_example-0.1.tar.gz ~/packages/

5. 运行以下命令试验服务器:

代码语言:javascript
复制
pypi-server -p 8080 ~/packages

6. 现在,服务器就在侦听所有IP地址。在Web浏览器中,导航到192.0.2.0:8080,您的Linode的公共IP地址则是在192.0.2.0。浏览器应显示:

pypiserver_home
pypiserver_home

您现在可以通过声明外部URL pip install --extra-index-url http://192.0.2.0:8080/simple/ --trusted-host 192.0.2.0 linode_example来安装linode_example包。

使用Apache和passlib进行验证

1. 为上传安装Apache和passlib基于密码的验证。请确保您仍处于已激活的虚拟环境中((venv)应出现在终端提示符之前),然后执行以下操作:

代码语言:python
代码运行次数:0
复制
sudo apt install apache2 
pip install passlib

2. 使用htpasswd创建用于身份验证的密码并将htpasswd.txt移入~/packages目录。输入所需的密码两次:

代码语言:javascript
复制
htpasswd -sc htpasswd.txt example_user 
New password: 
Re-type new password:

3. 安装并启用mod_wsgi以允许Bottle(一个WSGI框架)与Apache的连接:

代码语言:javascript
复制
sudo apt install libapache2-mod-wsgi sudo a2enmod wsgi

4. 在~/packages的目录中,创建一个pypiserver.wsgi的文件,创建一个应用程序对象,以便在pypiserver和Apache之间进行连接:

packages/pypiserver.wsgi

代码语言:javascript
复制
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

代码语言:python
代码运行次数:0
复制
<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的方式从客户端上传:

代码语言:javascript
复制
sudo chown -R www-data:www-data packages/

7. 如果需要,请禁用默认站点并启用pypiserver:

代码语言:javascript
复制
sudo a2dissite 000-default.conf 
sudo a2ensite pypiserver.conf

8. 重启Apache:

代码语言:javascript
复制
sudo service apache2 restart

默认情况下,应该可以在端口80上通过192.0.2.0访问存储库,其中192.0.2.0是Linode的公共端口。

从客户端下载

回想一下刚才声明的相当长的标志pip,以便可以从指定的存储库下载。然后创建一个包含公共服务器IP的配置文件可以让使用更简便。

1. 在客户端计算机上,在主目录中创建一个.pip目录。在此目录中,使用以下内容创建pip.conf: pip.conf

代码语言:javascript
复制
[global] 
extra-index-url = http://192.0.2.0:8080/ 
trusted-host = 192.0.2.0

2. 安装linode_example包:

代码语言:javascript
复制
pip install linode_example

注意 终端输出和显示所有包如用pip list都会显示包名中的下划线已转换为破折号。这是因为setuptools已使用safe_name的实用程序。有关此问题的深入讨论,请参阅此邮件列表主题

3. 打开Python shell并试用新的包:

代码语言:python
代码运行次数:0
复制
>>from linode_example import hello_world 
>>hello_world() 
hello world

使用Setuptools远程上传

虽然可以使用scp将tar.gz的文件传送到存储库,但还有其他工具如twineeasy_install也可以使用。

1. 在客户端计算机上,在名为.pypirc的主目录中创建新配置文件,将调用远程存储库linode: .pypirc

代码语言:python
代码运行次数:0
复制
[distutils] 
index-servers =
   pypi
   linode 
[pypi] 
username: 
password: 
[linode] 
repository: http://192.0.2.0 
username: example_user 
password: mypassword

上传到官方Python包索引是需要一个帐户的,尽管帐户信息字段可以留空。可以将example_usermypassword 替换为之前定义的认证信息htpasswd

2. 从Python包的目录上传:

代码语言:javascript
复制
python setup.py sdist upload -r linode

若成功,控制台将打印出这条消息:Server Response (200): OK

更多信息

有关此主题的其他信息,您可能需要参考以下资源。虽然提供这些是希望它们有所帮助,但请注意,我们无法保证外部托管材料的准确性或及时性。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python是如何处理包管理的?
    • 在您开始之前
    • 极简主义Python包
    • 安装PyPI服务器
    • 使用Apache和passlib进行验证
    • 从客户端下载
    • 使用Setuptools远程上传
      • 更多信息
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档