【问题标题】:Compile multiple .py files to windows executable (.exe)将多个 .py 文件编译为 windows 可执行文件 (.exe)
【发布时间】:2018-09-01 14:35:32
【问题描述】:

我有一个相对较小的 Python 程序,我想将其转换为 Windows 可执行文件。它最初是用 Pycharm 编写的,并在其中正常运行。

它由我编写的两个 .py 文件和一些库(全部从 pip 安装)组成。

我正在尝试使用 cx_Freeze 完成我的工作,但没有取得多大成功。 我的 setup.py 是这样的:

from cx_Freeze import setup, Executable
import os.path

PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6') 
os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6')

setup(name="MFS-printer",
      version='1.0.0',
      description='A parser for the log file from the terminal exit of the mfs system',
      options={"build_exe": {"packages": ["file_read_backwards", "Pil", "watchdog", "win32print", "win32ui", "tkinter", "log_parser"],
                             "include_files": ["Roboto-Bold.ttf", "mfs_robot(2).png", os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'), os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'),]
                             }
                },
      executables = [Executable("main.py"), Executable("log_parser.py")], requires=['watchdog']
      )

在运行 python setup.py build 以创建 windows 应用程序后,没有错误存在,但是当我尝试运行应用程序时,它在启动时崩溃并出现此错误:

我从这两个文件(main.py 和 log_parser.py)的导入如下:

main.py:

import os,time
import datetime
import log_parser

import win32print
from tkinter import filedialog
from tkinter import *

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from pathlib import Path

log_parser.py

import os

import win32print
import win32ui

from file_read_backwards import FileReadBackwards
from PIL import Image, ImageDraw, ImageFont, ImageWin

setup.py 可能有问题,但我找不到。 任何帮助将不胜感激。

【问题讨论】:

    标签: python windows python-3.x compilation cx-freeze


    【解决方案1】:

    有一个更好的答案,但我只会使用 python 线程。您可以将两个脚本合二为一并同时运行它们。

    这是一个线程示例:

    from threading import Thread
    from time import sleep
    
    def script1():
        while (True):
            print("1")
            sleep(2)
    
    def script2():
        while (True):
            sleep(.1)
            print("2")
            sleep(1.9)
    
    Thread(target = script1).start()
    Thread(target = script2).start()
    

    编辑,试试这个:

    将所有必要的模块导入第一个(主)脚本。除了添加from [filenameofsecondscript] import *,脚本将在导入时运行,因此请确保仅使用定义,而不是在需要时调用定义。而不是创建一个新的 exe,其中包含作为 .py 的第二个脚本(不是 exe!)。

    【讨论】:

    • 脚本不会同时运行,第一个像这样调用第二个: log_parser.parse(argument) 所以 main 每次运行时都会等待 log_parser 完成。我知道这一切都可以在一个脚本中,但它会太混乱,不容易阅读/维护
    • 你应该考虑一下,也许只是使用定义。
    • 最后我回到 python 3.4 并用 PyInstaller 编译它。工作完成,如果您对这个问题以及为什么我无法编译我的 python3.7 代码感兴趣,请在您的下方查看我的答案。
    【解决方案2】:

    目前 cx_Freeze 似乎并不真正支持 Windows 64 位的 Python3.7(直到现在)。这是引用它的 Github 问题。我希望到其他人搜索它时,它会被修复!

    https://github.com/anthony-tuininga/cx_Freeze/issues/399

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 2015-05-26
      • 2013-07-08
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多