专栏首页最新技术如何创建私有Python包存储库

如何创建私有Python包存储库

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。

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/中。

安装PyPI服务器

接下来,设置服务器以托管包索引。本指南将使用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包。

使用Apache和passlib进行验证

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

使用Setuptools远程上传

虽然可以使用scp将tar.gz的文件传送到存储库,但还有其他工具如twineeasy_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_usermypassword 替换为之前定义的认证信息htpasswd

2. 从Python包的目录上传:

python setup.py sdist upload -r linode

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

更多信息

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

本文的版权归 林纾燊 所有,如需转载请联系作者。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 大数据架构的未来

    大家应该都清楚,数据正在以巨幅的速度增长。如果能够有效地利用这些数据,可以发现非常有价值的内容,然而传统技术(许多早在40年前设计的,比如RDBMS这样的技术)...

    林纾燊
  • 数据包络分析教程

    数据包络分析(Data Envelopment Analysis,也称DEA)是一种用于进行前沿分析的非参数方法。它使用线性规划来估计多个决策单元的效率,它广泛...

    林纾燊
  • 深入学习Apache Spark和TensorFlow

    想要了解更多关于Apache Spark的信息,请在2016年2月在纽约出席Spark东部峰会。

    林纾燊
  • 记录GOPATH在GOLAND中的坑

    这里的GOPATH已经出错了,所以编译找不到,我检查了go env也是正确的GOPATH....

    超蛋lhy
  • Redis分布式锁的实现方式

    2.2 不会发生死锁,那就是当一个人持有锁之后,因为系统崩溃,而未释放锁,那么就需要释放锁

    用户6510625
  • 技术面试与HR谈薪资技巧

    作为“生在红旗下,长在春风里”的“四有新人”(现在90后00后还有知道这个词的吗?^_^),张小方同志从毕业至今,与各路HR、HRD斗智斗勇,再加上自己的不懈努...

    范蠡
  • C++ int string 转换

    用户1258909
  • Oracle面试题及答案整理,速速收藏

    好久没有给大家发面试题了,最近收集了一套Oracle的面试题,特地整理出来分享给大家,希望对你有帮助。

    Lenis
  • Micro-targeting:大数据分析在政治领域的应用

    美国总统大选已经进入了白热化阶段,各竞选团队为了给候选人拉票可谓绞尽脑汁,使出浑身解数。今天为大家介绍的这个“micro-targeting”,是数据分析在政治...

    数说君
  • mysqldump与innobackupex备份过程你知多少(三)

    相关阅读: mysqldump与innobackupex备份过程你知多少(二) mysqldump与innobackupex备份过程你知多少(一) mysqld...

    沃趣科技

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动