2013-09-27 79 views
22

這很容易重新創建。 如果我的腳本foo.py是:Pyinstaller --onefile在導入scipy或scipy.signal時警告pyconfig.h

import scipy 

然後運行:

python pyinstaller.py --onefile foo.py 

當我啓動我foo.exe的獲得:

WARNING: file already exists but should not: C:\Users\username\AppData\Local\Temp\_MEI86402\Include\pyconfig.h 

我測試過幾個版本,但我已經確認的最新版本是運行在Win7上的2.1dev-e958e02,Python 2.7.5(32位),Scipy版本0.12.0

我已經提交了Pyinstaller人的票,但還沒有聽到任何聲音。任何線索如何進一步調試?

回答

20

你能砍的規範文件由=分析後,將這些行刪除第二個實例:

for d in a.datas: 
    if 'pyconfig' in d[0]: 
     a.datas.remove(d) 
     break 
+0

這是一個解決方法,但它的工作完美。謝謝! – Jonno

+1

可悲的是,這種解決方法並不適合我。它擺脫了「文件已存在」的錯誤,但現在--onefile可執行文件只是沒有任何警告崩潰。我會再擺弄一下,看看我能不能弄清楚什麼。 – dthor

+0

@dthor,你有沒有得到這個解決?我似乎被困在同一個地方。 – devanl

0

我跑(從PyInstaller)的archive_viewer.py實用上具有同樣的錯誤我自己--onefile可執行文件之一,發現pyconfig.h包括兩次:

(31374007, 6521, 21529, 1, 'x', 'include\\pyconfig.h'), 
(31380528, 6521, 21529, 1, 'x', 'Include\\pyconfig.h'), 
(31387049, 984, 2102, 1, 'x', 'pytz\\zoneinfo\\CET'), 

不過不幸的是,我不知道如何解決它。

PyInstaller手冊鏈接: http://www.pyinstaller.org/export/d3398dd79b68901ae1edd761f3fe0f4ff19cfb1a/project/doc/Manual.html#archiveviewer

5

擴大在伊利亞的解決方案,我認爲這是一個更強大的解決方案來修改spec文件(再次放置在a = Analysis ...語句之後)。

a.datas = list({tuple(map(str.upper, t)) for t in a.datas}) 

我只在一個小的測試程序(一個有一個導入和打印語句)上測試過,但它似乎工作。 a.datas是包含pyconfig.h路徑的字符串元組的列表。我將它們全部轉換爲小寫,然後重複數據刪除。我實際上發現將所有這些全部轉換爲小寫足以讓它起作用,這表明pyinstaller在Windows上應該區分大小寫時進行區分大小寫的重複數據刪除。不過,我爲了好的措施做了自己的剔除。

+0

你的建議適用於Windows,但在Linux上失敗。只是fyi。 –

+0

我不確定,但我認爲這個問題甚至不會發生在Linux上,所以你不需要解決方案。你在Linux上有這個問題嗎? – scornwell

+0

適用於Windows。 – schemacs

15

wtobia @的答案爲我工作。見https://github.com/pyinstaller/pyinstaller/issues/783

  1. 轉到C:\Python27\Lib\site-packages\PyInstaller\build.py
  2. 找到def append(self, tpl):功能。
  3. 變化if tpl[2] == "BINARY":if tpl[2] in ["BINARY", "DATA"]:
+0

對我來說就像一個魅力! – pbreach

+1

鏈接已死;也許看到https://github.com/pyinstaller/pyinstaller/issues/783而不是 – SaintDako

+0

它看起來像這個問題已經在開發版本中修復了,但是他們還沒有推出[一個版本](https://github.com/pyinstaller/pyinstaller/releases)。[scornwell]的解決方法(http://stackoverflow.com/a/20695056/4794)適用於我。 –

1

我意識到問題是,Windows不區分大小寫,並且這些2個語句在源目錄是「重複: 包括\ pyconfig.h 包含\ pyconfig.h

我的解決方法是手動調整代表.spec文件與A =分析()調用之後:

import platform 
if platform.system().find("Windows")>= 0: 
    a.datas = [i for i in a.datas if i[0].find('Include') < 0] 

這個工作在我的2次測試。

更靈活的解決方案是檢查所有項目是否區分大小寫的衝突。

相關問題