我的包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使用畅达环境
libBar.so是一个水平之上酒吧/ __ init__.py所以这没有找到它。是否有一个setuptools/pkg_resources方法来简单地获取给定模块的__init__.py所在的目录?我似乎无法找到一个... – Dan
我不确定,但如果它是通过'setuptools'函数安装包的一部分,则有办法获取任何资源,这是我上面写的可能方法之一。请参阅我提供的链接以寻找其他功能,以更好地适应您的情况。你也可以尝试像上面那样获取'__init __。py',然后使用'glob'和'/../ libBar.so'获取文件。 – Nikita