将多个.py文件编译为Windows可执行文件(.exe)

时间:2018-09-01 14:35:33

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

我有一个相对较小的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应用程序后,没有错误存在,但是当我尝试运行该应用程序时,它因以下错误而崩溃:

this is after I double click on the executable

我从这两个文件(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可能有问题,但是我找不到。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

有一个更好的答案,但是我只会使用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 *相比,脚本将在导入时运行,因此请确保仅使用定义,而不是在需要时调用定义。比用第二个脚本作为.py(不是exe!)创建新的exe。

答案 1 :(得分:0)

看来,到目前为止,cx_Freeze并不真正支持Windows 64位的Python3.7(直到此日期)。这就是引用它的Github问题。我希望等到有人搜索时,它会得到解决!

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