python-2.6 - 在全局包上导入本地包

标签 python-2.6 centos6

我正在为一个大型 Python 项目开发一个支持库,该项目通过将各种项目目录附加到 sys.path 来大量使用相对导入。

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

我的包的依赖项之一是 pyasn1 package用于 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") 在项目的主应用程序中,无需我们的工程师将命令行参数传递给安装脚本。

setup.cfg

[install]
install-lib=.lib

setup.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 时,它会导入全局版本并忽略本地安装的版本。

作为一种可能的解决方法,我尝试通过执行 package_dir = {'pyasn1_0_1_6 ':'pyasn1-0.1.6/pyasn1'}。但是,这会失败,因为在内部使用到 pyasn1 包的导入不使用 pyasn1_0_1_6 名称。

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

最佳答案

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

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

理由

如果您编写setuptools,这个过程很容易实现自动化使用 install_requires 指定依赖项的脚本。有关完整示例,请参阅 this one I wrote

设置

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

首先创建一个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

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

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

关于python-2.6 - 在全局包上导入本地包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16389955/

相关文章:

python - 无法在centos上安装python新版本2.7.8

python - int() 和 long() 之间的区别

python - 如何从列表 Python 创建类实例

python - 适用于带有 apache 2 和 Python 2.6 的 Windows 的 mod_wsgi

linux - Centos6 上的构建问题

git - 为什么 SaltStack pkg.installed 命令无法识别 CentOS 6.6 上已安装的软件包

centos 6.4 上的 mysql 5.5

python - 同时使用带参数和不带参数的装饰器

wcf - 使用故障时如何从 suds 客户端获取 http 响应代码

amazon-web-services - 我可以在带有 vagrant 的 aws 上使用哪个 centos 图像?