2013-07-03 71 views
5

安裝第三方Python軟件包我使用了setup.py腳本,它使用setuptools.setup()來安裝一堆軟件包。安裝完成後,我可以在/usr/local/lib/python2.7/dist-packages下的另一臺機器上以及/usr/lib/python2.7/site-packages下的另一臺機器上找到這些軟件包。如何找出Python庫的安裝路徑?

現在我想編寫一個Python腳本來查找第三方軟件包的安裝位置。我怎樣才能做到這一點?

1)sys.prefix = sys.exec_prefix在兩臺機器上都是「/ usr」。

2)python可執行文件位於/ usr/bin/python兩臺機器上。

3)distutils.sysconfig.get_python_lib()是/usr/lib/python2.7/dist-packages(「local」缺失)在一臺機器上,/usr/lib/python2.7/site-packages on另一臺機器。

回答

0

我不知道在Python中執行此操作的好方法(除了從給定根目錄中爬取目錄以使用os.walk查找文件)。如果你沒有得到任何關於如何在Python中做到這一點的更好的答案,你可以在你的操作系統上從python執行一個命令,在你正在尋找的庫上執行標準的Linux/Unix查找命令。你可以使用subprocess module來做到這一點。

+0

我寧願比搜索目錄樹更「優雅」的解決方案。 setuptools如何知道要安裝到哪裏? – user2539266

+0

重點在於,即使您可以使用相同的方法來建立默認目錄,也不會允許用戶未使用默認目錄的情況。我不知道任何其他方式,但會有興趣看看還有什麼其他的建議。 – ChrisProsser

4

如果包已經安裝,你可以只導入,並看看他們__file__屬性:

>>> import mymodule 
>>> print mymodule.__file__ 
'/path/to/mymodule.py' 
+0

有趣的把戲。但是,如果在不同的主機上安裝的軟件包不同,並且您不知道特定主機上是否安裝了某個模塊,則無法使用它。 – user2539266

+0

這對我的答案很有幫助。 –

1

幾乎找到了解決這個問題。我提到this questionthis question,所以感謝那裏給出的答案。

首先,您需要將所有已安裝模塊列表放入列表中。使用this question來捕獲solution to this question的輸出。

現在你有一個所有安裝的python模塊的列表。您需要查看列表的格式,然後正確格式化以獲取各個元素作爲模塊的名稱。

然後,您可以按照here所解釋的那樣從其名稱中導入模塊名稱。然後,亞歷山大羅已經說過mymodule.__file__包含路徑。

這是應該工作的一種解決方案。不是很優雅,但我只是一個在Python搜索方面比Python更好的Python初學者


我發現了一個更容易找到模塊的地方。這可能是OP尋找的「優質」解決方案。

import sys 
print sys.path 

從Python文檔約sys modulesys.path包含

的字符串列表,用於指定模塊的搜索路徑。從環境變量PYTHONPATH初始化,加上依賴於安裝的默認值。

+0

我不知道它提前看到什麼是可能的目錄。它可以是/ usr或/ usr/local或私有Python安裝,它可以是dist-packages或site-packages。 setuptools如何知道要安裝到哪裏? – user2539266

+0

@ user2539266更新了答案。看一看。 –

0

我發現我的安裝路徑,通過sys.path

my_name = "mypackage" 
def _post_install(): 
    def find_module_path(): 
     for p in sys.path: 
      if os.path.isdir(p): 
       for f in os.listdir(p): 
        if f == my_name: 
         return os.path.join(p, f) 
    install_path = find_module_path() 
    # do something we the install_path 

注意:此運行的包已經被setuptools註冊後,你可能還必須處理,如果包已經被安裝在多個sys.path內的目錄。