Не в состоянии построить автономный исполняемый файл на MacOS - PullRequest
0 голосов
/ 24 февраля 2019

Я хочу сделать автономный исполняемый файл из скрипта на MacOS (10.14).

Сценарий my_app.py и имеет следующее содержимое:

#!/usr/bin/env python

import os.path
import csv
import pandas as pd

##1 open the file
f=open("path/to/original_file.txt", "r")

filedata = f.read()
##1

##1.1 replace the desired characters
filedata = filedata.replace("\\", ",")
filedata = filedata.replace("*", "")

with open("path/to/new_file.txt", 'w') as file:
  file.write(filedata)
##1.1

иследующий setup.py файл:

from setuptools import setup

APP = ["my_app.py"]
DATA_FILES = []
OPTIONS = {
    "argv_emulation": True,
    "packages": ["certifi"],
}
setup(
    app = APP,
    data_files = DATA_FILES,
    options = {"py2app": OPTIONS},
    setup_requires = ["py2app"]

)

Следуя инструкциям в предыдущем SO вопросах с ответом , я последовательно ввел следующие команды в Terminal:

pip install virtualenv
virtualenv venv --system-site-packages
source venv/bin/activate
pip3.7 install -U py2app
cd /path/to/my_app.py
python setup.py py2app -A

Однако, когда я дважды щелкаю my_app.app (который только что был создан и находится в /Users/mymac/Documents/applications/myapp/dist), я получаю следующее сообщение об ошибке во всплывающем окне

enter image description here

Что я делаю не так?Связано ли это с тем, что в моем приложении нет фреймворка с графическим интерфейсом (например, PyQT или Tkinter)?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Наконец-то можно создать автономную оболочку,

  • , обернув приложение вокруг фреймворка PyQt
  • , используя PyInstaller для сборки приложения

my_app.py должен выглядеть следующим образом:

import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QLabel, QGridLayout, QWidget
from PyQt5.QtCore import QSize

class HelloWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.setMinimumSize(QSize(640, 480))
        self.setWindowTitle("Hello world")

        centralWidget = QWidget(self)
        self.setCentralWidget(centralWidget)

        gridLayout = QGridLayout(self)
        centralWidget.setLayout(gridLayout)

        title = QLabel("Hello World from PyQt", self)
        title.setAlignment(QtCore.Qt.AlignCenter)
        gridLayout.addWidget(title, 0, 0)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mainWin = HelloWindow()
    mainWin.show()
    sys.exit( app.exec_() )

Затем вы перейдете в каталог, в котором находится my_app.py.Затем вы запускаете

PyInstaller my_app.py

. Это создаст несколько каталогов: __pycache__, build и dist.Внутри dist есть еще один каталог с именем my_app.В этом каталоге будет находиться исполняемый файл с именем my_app (или со ссылкой на исходный вопрос, внутри пути path/to/dist/my_app/) ==>, дважды щелкните по нему, и ваше приложение будет запущено!

0 голосов
/ 24 февраля 2019

Скорее всего, вам нужно включить какую-нибудь библиотеку времени выполнения, но другой вариант - создать скрипт для запуска приложения, а затем исправить, чтобы вы могли запустить свой скрипт из Finder, дважды щелкнув по нему, см. этовопрос о некоторых альтернативных способах сделать это.

Самый простой способ, упомянутый в связанном вопросе, - дать сценарию расширение .command, тогда вам больше не нужно будет ничего делать.

Преимущество использования скрипта заключается в том, что он выполняется в Терминале (в оболочке), поэтому вам необходимо иметь все библиотеки и т. Д. Автоматически доступными.

...