2013-02-03 103 views
7

我想在Linux上使用PyInstaller 2.0製作一個Python腳本的二進制版本。當我運行:PyInstaller在製作二進制文件時無法找到libpython2.7.so?

$ python pyinstaller.py myscript.py 

我得到的錯誤:

8907 INFO: Looking for Python library libpython2.7.so 
Traceback (most recent call last): 
... 
    File "pyinstaller.py", line 91, in <module> 
    raise IOError("Python library not found!") 
IOError: Python library not found! 

如何這個問題能解決?

我使用:

Linux的#98,Ubuntu的x86_64的GNU/Linux的

與Python 2.7。有系統上的其他蟒蛇,但我有它設置:

alias python="python2.7" 

在服務器中,我使用的話,只有/usr/lib/python2.6而不是/usr/lib/python2.7但是Python 2.7是由我經常使用,是功能性的,等於是我沒有看到它爲什麼會找到它的庫是一個問題。有一個/usr/local/lib/libpython2.7.a

+0

第一:什麼發行(和版本)是你嗎?你使用的是你的發行版的默認Python包嗎?你有沒有其他的Python安裝?實際上是否有'/ usr/lib/libpython2.7.so'(或者路徑中的其他地方)? (通常有兩個獨立的pythonX.Y包,其中一個包括足夠的運行解釋器,其中一個包括編譯C擴展所需的所有東西,名稱類似'pythonX.Y-dev',有時也稱爲'libpythonX'。 Y'是後者的一部分。) – abarnert

+0

@abarnert:我編輯了我的問題來回答你的問題 – user248237dfsf

+0

如果你回答了你從哪裏獲得兩個Python安裝,那真的很有幫助。爲什麼2.6有一個'so',但是2.7沒有?但我會試着回答我的猜測。 – abarnert

回答

6

In the server I am using, there's only /usr/lib/python2.6 and not /usr/lib/python2.7 but python 2.7 is used routinely by me and is functional, etc. so I don't see it why it would be a problem to find its libraries. There is a /usr/local/lib/libpython2.7.a.

如果沒有libpython2.7.so,當然這將是一個問題,找到該庫。

你能夠使用Python解釋器的原因可能是它是靜態鏈接的。

有兩種方法可以解決這個問題。

首先,您可以爲Python 2.7安裝共享庫。如果您使用的是Python 2.6的舊版本,並且您從python2.7軟件包安裝了2.7,則應該只是安裝libpython2.7

如果你從其他來源得到的2.7,Ubuntu的libpython2.7包顯然是行不通的,或者它會通過安裝python2.7的第二個副本,可能覆蓋一些你已經有文件的工作,絕對會讓你困惑。無論哪種方式,不要這樣做。或者爲現有的2.7獲取其餘的Python,或者卸載2.7並使用Ubuntu軟件包。 (對於某些Python發行版,「獲取其餘部分」是不可能的,因爲如果你安裝了共享庫,你將獲得一個動態鏈接的Python可執行文件,而不是靜態鏈接的可執行文件,在這種情況下,你幾乎必須卸載並重新安裝。)

其次,您可以使用PyInstaller的static-lib支持。有關詳細信息,請參閱ticket 420,但簡單的想法是,如果啓用此功能,並且PyInstaller認爲您的平臺應具有libpython2.7.so但無法找到它,它將查找libpython2.7.a,並靜態鏈接。上次我需要這個,它沒有被檢入到主幹中。通過快速瀏覽票證,看起來現在包含修補程序,但在默認PyInstaller版本中禁用了此修補程序,並且里程碑設置爲3.0,因此,您仍需要手動構建PyInstaller才能使其發揮作用。

最後一兩件事:這有可能是你有libpython2.7.so,但它剛剛安裝的地方怪異像/opt/python27/lib什麼的,用/opt/python27無處您的路徑上,但/usr/local/bin/python27可以找到它,因爲它明確地建成從/opt/python27中得到東西。這種事情往往只是Mac用戶或Fink用戶的問題,而不是Linux用戶,但這並非不可能。如果您認爲這可能是問題,您可以查看dl表/usr/local/bin/python27

+0

您可以編寫「您可以爲Python 2.7安裝共享庫」 - 我該如何去做這件事?安裝我自己的本地版本的Python 2.7並使用它而不是全局可用的版本會更容易嗎? – user248237dfsf

+0

您是否閱讀了本段的其餘部分? 「如果...你從[Ubuntu]'python2.7'軟件包安裝了2.7,這應該只是安裝'libpython2.7'的問題。」如果你從另一個來源安裝2.7,我顯然不能回答這個問題,除非你告訴我你是如何安裝它的。 – abarnert

+1

我當然這樣做,我仍然不知道如何安裝libpython 2.7。那是標準程序嗎?我不能在/ usr/*中安裝任何東西,因爲我不是這裏的系統管理員。 – user248237dfsf

1

有2個選項:libpython * .so存在或不存在於您的系統上。您可以從根目錄開始的任何查找實用程序檢查它。如果該文件已經存在但仍然無法被PyInstaller找到:最通用的建議是打開PyInstaller代碼並找到負責找到該庫的模塊。它可以用簡單的編輯器完成。比去這個模塊和編輯他了解你的具體系統有什麼問題。代碼簡單且不成熟 - 需要5分鐘才能理解原因。在我的情況下,我只是將LD_LIBRARY_PATH =/usr/local/lib添加到我的用戶配置文件(.bash_profile)中,並確保這個* .so文件位於裏面。如果該文件不在您的系統中,或者您的版本不正確,請重新安裝python。

1

正如@abarnert已經說過的,這個問題似乎是python的靜態編譯。爲了解決這個問題,需要重新編譯蟒蛇,但增加的標誌--enable-共享這個時候:

[[email protected] ~]# ./configure --prefix=/usr/local --enable-shared 
    [[email protected] ~]# make && make altinstall 

一旦你這樣做,你會發現所請求的庫(libpython2.7.so。 1.0)在/ usr/local/lib目錄路徑,所以不要忘記到該文件夾​​添加到$ LD_LIBRARY_PATH環境變量:

[[email protected] tmp]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib 
+0

有人說這個答案在某些時候沒有用,請你解釋一下爲什麼?它已經過測試,至少在一個類似的情況下,它實際上解決了這個問題中報告的錯誤,所以誠實地說,雖然它可能對某些人有幫助。 –

相關問題