无法在MacOS上构建独立的可执行文件

时间:2019-02-24 07:55:18

标签: python-3.x macos-mojave py2app python-standalone

我想用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 questions with answer中的步骤,我在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

我在做什么错? 是否与我的应用程序中没有GUI框架(例如PyQT或Tkinter)有关?

2 个答案:

答案 0 :(得分:0)

可能您需要包括某种类型的运行时库,但是另一个选择是创建一个脚本来运行您的应用程序,然后进行修复,以便您可以通过双击Finder从Finder中启动脚本,请参见{{3} },了解其他一些替代方法。

在链接的问题中提到的最简单的方法是给脚本扩展名.command,那么您无需执行其他任何操作。

使用脚本的好处是,它是在终端(在shell中)中执行的,因此您应该自动使所有库等可用。

答案 1 :(得分:0)

我终于可以通过

建立一个独立的
  • 围绕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所在的目录cd。然后,您运行

PyInstaller my_app.py

这将创建几个目录:__pycache__builddistdist内还有一个名为my_app的目录。在此目录中将有一个名为my_app的可执行文件(或在路径path/to/dist/my_app/中引用原始问题)==>双击该文件,您的应用程序正在运行!

相关问题