我正在为一个大型 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_6
package_dir = {'pyasn1_0_1_6':'pyasn1-0.1.6/pyasn1'}
pyasn1
pyasn1_0_1_6
是否有某种方法可以a)强制Python在全局安装的包上导入本地安装的包,或者b)强制以不同的名称安装包?