2017-08-29 97 views
0

我在python中使用python 3.6.2和Mac OS Sierra上的自制軟件,並且我一直無法使用py2app v0.14創建功能包應用程序和pyinstaller v3.2.1。無法在Sierra上使用py2app和python創建功能應用程序包3.6.2

安裝ActiveTcl版本8.5.18/tkinter。

標準2.7.10 python的Mac版本沒有其他功能。我實際上設法做了一兩次嘗試與其他程序一起使用Python 2.7.10,但由於我想使用3.6.2,所以沒有必要繼續使用標準。

py2app創建一個.app文件,該文件只是給出「錯誤」,Mac要求終止。 pyinstaller甚至不創建一個.app文件。我遵循所有計劃中的所有說明。創建的.app時

py2app給了我這個消息結尾:

Modules not found (unconditional imports): 

* com (com.sun.jna) 
* com.jna (com.sun) 
* com.sun (com.sun.jna.platform) 
* ordereddict (pkg_resources._vendor.pyparsing) 
* win32com (win32com) 
* win32com.shell (win32com.shell) 
* win32com.shellcon (win32com.shell) 

Modules not found (conditional imports): 

* StringIO (pkg_resources._vendor.six) 
* com (pkg_resources._vendor.appdirs) 
* com.sun.jna (pkg_resources._vendor.appdirs) 
* com.sun.jna.platform (pkg_resources._vendor.appdirs) 
* win32com (pkg_resources._vendor.appdirs) 
* win32com.shell (pkg_resources._vendor.appdirs) 

我檢查丟失模塊,對我來說並不像程序正在嘗試使用上面列出的任何模塊。

我從互聯網上檢索到的節目,這是一個簡單的測試程序,這裏的腳本:

from tkinter import * 
from tkinter import ttk 

def calculate(*args): 
    try: 
     value = float(feet.get()) 
     meters.set((0.3048 * value * 10000.0 + 0.5)/10000.0) 
    except ValueError: 
     pass 

root = Tk() 
root.title("Feet to Meters") 

mainframe = ttk.Frame(root, padding="3 3 12 12") 
mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) 
mainframe.columnconfigure(0, weight=1) 
mainframe.rowconfigure(0, weight=1) 

feet = StringVar() 
meters = StringVar() 

feet_entry = ttk.Entry(mainframe, width=7, textvariable=feet) 
feet_entry.grid(column=2, row=1, sticky=(W, E)) 

ttk.Label(mainframe, textvariable=meters).grid(column=2, row=2, sticky=(W, E)) 
ttk.Button(mainframe, text="Calculate", command=calculate).grid(column=3, row=3, sticky=W) 

ttk.Label(mainframe, text="feet").grid(column=3, row=1, sticky=W) 
ttk.Label(mainframe, text="is equivalent to").grid(column=1, row=2, sticky=E) 
ttk.Label(mainframe, text="meters").grid(column=3, row=2, sticky=W) 

for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5) 

feet_entry.focus() 
root.bind('<Return>', calculate) 

root.mainloop() 

我已經試過卸載並重新安裝蟒蛇,ActiveTcl,我已經運行BREW醫生,似乎沒有任何工作。 Pyenv工作正常。 Homebrew工作正常。

我到處搜索了兩天,無論我每次做什麼py2app創建.app文件,它只會給出「錯誤」。

當我運行IDLE時,該應用程序運行完美。什麼問題可以?

編輯:經過一段時間的工作,我發現了python 3.6.2使用cx_freeze的解決方案。正如我之前所說,Py2app只能用於Python 2.7.10。出於某種原因,Py2app只在我使用Python 2.7.10運行時加載缺少的模塊,當python 3.6.2進來時,他無法加載模塊,並且.app文件無法正常工作。

回答

0

在我自己的'pyjinks'與py2app後,我發現了一些可能涉及的事情。

首先,您的'錯誤'問題聽起來像是我的應用程序文件同步(通過Dropbox風格的服務)到另一臺計算機時遇到的問題。該文件可以在創建它的計算機上正常運行,但是當我嘗試在遠程計算機上運行它時,會出現無法打開的錯誤。但是,如果我通過谷歌驅動器上傳應用程序文件,然後將其下載到遠程計算機,它會打開並運行良好!所以,在我發現後,我發現這個遠程計算機上的應用程序包內的python腳本沒有執行權限。在腳本上運行'chmod 775 myapp.py'後,MacOs會打開它。

我遇到了一個使用pydub和ffmpeg的應用程序,它與pydub使用子進程來運行ffmpeg有關。如果ffmpeg在你的系統路徑中,那麼pydub會發現它確定,但是如果你使用py2app打包你的應用程序,那麼它是一個不同的故事,因爲應用程序中的ffmpeg不會在[其他計算機]的系統路徑中, 。最後我用這條線在我的Python應用程序,以確定其中的ffmpeg是:順便說一句,AudioSegment是pydub的模塊和轉換器屬性告訴它來尋找它在這個特定的路徑格式轉換工具:

AudioSegment.converter = "../Frameworks/ffmpeg" 

然後我把這個在py2app安裝文件:

OPTIONS = { 
    'frameworks': ['/usr/local/Cellar/portaudio/19.6.0/lib/libportaudio.dylib', 
    '/usr/local/Cellar/ffmpeg/3.4/bin/ffmpeg'], } 

這告訴py2app到[portaudio和] ffmpeg的框架添加到包。但是,我發現包含的名爲ffmpeg的文件沒有執行權限。在創建每個py2app之後,我必須在應用程序'bungle'的內容中'chmod 775 ffmpeg',以便允許應用程序運行ffmpeg。
我不確定py2app是否有特殊的規則,允許它創建具有執行權限的文件,但它不會自動執行。

在對這類事情進行故障診斷時,可能很難獲取有關哪裏出錯的信息。所以我尋找額外的技術來找出發生了什麼問題。在解決py2app問題時使用大量嘗試可能是個好主意,因此您不會錯過任何例外:

try: 
    from tkinter import * 
except Exception as e: 
    print("tkinter didn't import: {}".format(e)) 
相關問題