3

我正在为一个大型 Python 项目开发一个支持库,该项目通过将各种项目目录附加到sys.path.

使用The Hitchhiker's Guide to Packaging作为模板,我尝试创建一个包结构,它允许我进行本地安装,但如果需要,以后可以轻松更改为全局安装。

pyasn1我的包的依赖项之一是用于编码和解码 ASN.1 注释对象的包。我必须pyasn1单独包含该库,因为 CentOS 6.3 默认存储库支持的版本是一个主要版本,并且有已知的错误会破坏我的自定义包。

库结构的顶层如下:

MyLibrary/
  setup.py
  setup.cfg
  LICENSE.txt
  README.txt
  MyCustomPackage/
  pyasn1-0.1.6/

在我的安装配置文件中,我将库的安装目录定义为名为.lib. 这是可取的,因为它允许我通过import site; site.addsitedir("MyLibrary/.lib")在项目的主应用程序中运行命令来执行绝对导入,而无需我们的工程师将命令行参数传递给设置脚本。

设置.cfg

[install]
install-lib=.lib

安装程序.py

setup(                                                                          
   name='MyLibrary',
   version='0.1a',
   package_dir = {'pyasn1': 'pyasn1-0.1.6/pyasn1'},   
   packages=[
             'MyCustomPackage',         
             'pyasn1',
             'pyasn1.codec',
             'pyasn1.compat','
              pyasn1.codec.ber',
             'pyasn1.codec.cer',
             'pyasn1.codec.der',
             'pyasn1.type'
            ],
   license='',
   long_description=open('README.txt').read(),
   data_files = []
)

我以这种方式安装时遇到的问题是,当我的包尝试导入pyasn1它时,它会导入全局版本并忽略本地安装的版本。

作为一种可能的解决方法,我尝试使用与全局包(例如)pyasn1不同的名称安装包。但是,这会失败,因为包内部使用的导入不使用该名称。pyasn1_0_1_6package_dir = {'pyasn1_0_1_6':'pyasn1-0.1.6/pyasn1'}pyasn1pyasn1_0_1_6

是否有某种方法可以a)强制Python在全局安装的包上导入本地安装的包,或者b)强制以不同的名称安装包?

4

1 回答 1

2

使用virtualenv 确保您的应用程序在完全已知的配置中运行,该配置独立于库的操作系统版本。

编辑:一个快速的(unix)解决方案是设置PYTHONPATH环境变量,它就像PATHPython 模块一样工作(模块从找到的第一个路径加载,所以只需在开头附加目录PYTHONPATH)。Anwyay,我强烈建议您继续使用virtualenv,因为它是专门为处理您所面临的情况而设计的。

基本原理

如果您编写一个setuptools脚本指定依赖关系,该过程很容易自动化install_requires。完整的例子可以参考我写的这个

设置

请注意,您可以轻松地将以下步骤插入到setup.shshell 脚本中。

首先创建一个virtualenv并输入:

$ virtualenv $name
$ cd $name

激活它:

$ source bin/activate

现在cd到您的项目目录并运行安装程序脚本:

$ cd $my_project_dir
$ python ./setup.py --prefix $path_to_virtualenv

注意--prefix $path_to_virtualenv,它用于告诉脚本安装在 virtualenv 而不是系统范围内。在激活 virtualenv 后调用它。请注意,所有依赖项都会自动下载并安装在 virtualenv 中。

然后你就完成了。当你想离开 virtualenv 时,发出:

$ deactivate

在随后的调用中,您只需要激活 virtualenv(步骤 2),runawesomeproject.sh如果您真的需要,可以使用 a。

如 virtualenv 网站上所述,您应该使用 virtualenv >= 1.9,因为以前的版本没有通过 HTTPS 下载依赖项。如果您认为纯 HTTP 就足够了,那么任何版本都可以。

您也可以尝试可重定位的 virtualenvs:设置它并将文件夹复制到您的主机。无论如何,请注意此功能仍处于实验阶段

于 2013-05-05T23:02:27.060 回答