Не удалось создать функциональный пакет приложений в Sierra с использованием py2app и python 3.6.2.

Я использую python 3.6.2 с pyenv и homebrew в Mac OS Sierra, и мне не удалось создать функциональные пакетные приложения с py2app v0.14 и pyinstaller v3.2.1.

ActiveTcl версии 8.5.18/tkinter установлены.

Стандартная версия Python 2.7.10 для Mac больше ничего не делает. На самом деле мне удалось сделать одну или две попытки работать на python 2.7.10 с другими программами, но, поскольку я хочу использовать 3.6.2, нет смысла оставаться на стандарте.

py2app создает файл .app, который просто выдает «ошибку», и Mac просит завершить работу. pyinstaller даже не создает файл .app. Я следовал всем инструкциям во всех программах.

py2app выдает мне это сообщение в конце при создании .app:

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()

Я пробовал удалить и переустановить python, ActiveTcl, запустить brew doctor, ничего не работает. Пиэнв работает нормально. Хоумбрю работает нормально.

Я искал везде в течение двух дней, и независимо от того, что я делаю, каждый раз, когда py2app создает файл .app, он выдает только «Ошибку».

Приложение отлично работает, когда я запускаю IDLE. Какая может быть проблема???

EDIT: После некоторого времени работы над этим я нашел решение для python 3.6.2, используя cx_freeze. Как я уже говорил, Py2app работает только с Python 2.7.10. По какой-то причине Py2app загружает только недостающие модули, о которых я упоминал ранее, при работе с python 2.7.10, когда появляется python 3.6.2, он не может загрузить модули, и файл .app не работает должным образом.


person Kalienov    schedule 29.08.2017    source источник


Ответы (1)


После моих собственных «pyjinks» с py2app я нашел несколько вещей, которые могут быть связаны.

Прежде всего, ваша проблема с «ошибкой» звучит как проблема, с которой я столкнулся, когда файл моего приложения был синхронизирован (через службу в стиле Dropbox) с другим компьютером. Файл будет работать нормально на компьютере, на котором он был создан, но я получаю сообщение об ошибке, что его невозможно открыть, когда я пытаюсь запустить его на удаленном компьютере. НО, если бы я загрузил файл приложения через Google Диск, а затем загрузил его на удаленный компьютер, он бы открылся и работал нормально! Итак, покопавшись, я обнаружил, что скрипт 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 Framework. НО, я обнаружил, что включенный файл с именем ffmpeg не имеет привилегий на выполнение. После создания каждого приложения py2app мне приходилось «chmod 775 ffmpeg» внутри содержимого приложения «сбивать», чтобы разрешить приложению запускать ffmpeg.
Я не уверен, есть ли специальные правила с py2app, которые позволяют ему создавать файлы с разрешениями на выполнение, но это не делалось автоматически.

При устранении неполадок такого рода может быть трудно получить информацию о том, что и где происходит не так. Поэтому я искал дополнительные методы, чтобы найти, что пошло не так. При устранении неполадок с py2app может быть хорошей идеей использовать много попыток, чтобы не пропустить ни одного исключения:

try:
    from tkinter import *
except Exception as e:
    print("tkinter didn't import: {}".format(e))
person chmedly    schedule 16.11.2017