2016-01-23 62 views
0

我的包Foo生成一个依赖于另一个包的扩展libFoo.so Bar的扩展libBar.so,我不知道先验已经安装了依赖项libBar.so。我需要知道依赖的目录,以便设置libFoo.so的rpath,以便它可以在运行时找到libBar.so。访问用户从setup.py中激活的虚拟环境,当他们从PyPI安装你的包时

我认为这样做的好方法可能是在我的setup.py中导入依赖包Bar并检查模块以获取目录,因为我知道libBar.so将与Bar包的目录相关。这样,如果他们从虚拟环境安装,我会找到适当的路径。但是,当我尝试这样做时,即当我激活一个虚拟环境并从PyPI安装我的包时,我发现setup.py中的import Bar最终从不同的虚拟环境中导入了一个版本(我可以通过在安装之后检查构建的libFoo.so的rpath来告诉)。

在另一方面,如果我在本地安装的Foo包通过导航到源目录并做pip install -e .与我的虚拟环境中启动,将rpath设置正确......

我怎样才能得到正确的行为从PyPI安装时?如果有帮助,这里是从setup.py相关代码:

import Bar 
barDir = os.path.dirname(inspect.getfile(Bar)) 

当我启动我的环境和一封来自PyPI安装,barDir是

/Users/me/anaconda/envs/WRONGENVIRONMENT/lib/python2.7/site-packages/bar

当我启动我的环境和安装在当地,barDir是

/Users/me/anaconda/envs/RIGHTENVIRONMENT/lib/python2.7/site-packages/bar

我运行OS X 10.10.5使用畅达环境

回答

0

原来这是一个愚蠢的缓存问题(PIP安装没有得到一封来自PyPI最新的包,但使用的是旧版的,我已与测试缓存副本) 。我不得不这样做

pip install --no-cache-dir Foo 

,以确保我得到一个新的版本

1

尝试使用pkg_resourcessetuptoolshttps://pythonhosted.org/setuptools/pkg_resources.html

喜欢的东西:

from pkg_resources import resource_string 
libbar = resource_string('Bar', 'libBar.so') 
+0

libBar.so是一个水平之上酒吧/ __ init__.py所以这没有找到它。是否有一个setuptools/pkg_resources方法来简单地获取给定模块的__init__.py所在的目录?我似乎无法找到一个... – Dan

+1

我不确定,但如果它是通过'setuptools'函数安装包的一部分,则有办法获取任何资源,这是我上面写的可能方法之一。请参阅我提供的链接以寻找其他功能,以更好地适应您的情况。你也可以尝试像上面那样获取'__init __。py',然后使用'glob'和'/../ libBar.so'获取文件。 – Nikita

相关问题