当他们从 PyPI pip 安装您的包时,从 setup.py 中访问用户激活的虚拟环境

access the user's activated virtual environment from within setup.py when they pip install your package from PyPI

我的包 Foo 构建了一个扩展 libFoo.so,它依赖于另一个包 Bar 的扩展 libBar.so,我不知道依赖项 libBar.so 已经安装在哪里。我需要知道依赖项的目录才能设置 libFoo.so 的 rpath,以便它可以在运行时找到 libBar.so。

我认为这样做的一个好方法可能是在我的 setup.py 中导入依赖包 Bar 并检查模块以获取目录,因为我知道 libBar.so 相对于Bar 包的目录。这样如果他们从虚拟环境安装,我会找到合适的路径。

但是,当我尝试这样做时,即当我激活虚拟环境并从 PyPI 安装我的包时,我发现 setup.py 中的 import Bar 最终从一个不同的虚拟环境(我可以通过在安装后检查内置的 libFoo.so 的 rpath 来判断)。

另一方面,如果我通过导航到源目录并在激活虚拟环境的情况下执行 pip install -e . 在本地安装 Foo 包,则 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 并使用 conda 环境

尝试使用 setuptools 中的 pkg_resourceshttps://pythonhosted.org/setuptools/pkg_resources.html

类似于:

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

原来这是一个愚蠢的缓存问题(pip install 没有从 PyPI 获取最新的包,而是使用了我一直在测试的旧版本的缓存副本)。我不得不做

pip install --no-cache-dir Foo

确保我得到的是新版本