簡體   English   中英

當他們從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軟件​​包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並使用conda環境

嘗試從setuptools使用pkg_resourceshttps : setuptools

就像是:

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

事實證明這是一個愚蠢的緩存問題(pip安裝沒有從PyPI獲取最新的軟件包,而是使用了我測試過的較早版本的緩存副本)。 我必須做

pip install --no-cache-dir Foo

確保我得到的是新版本

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM