我该如何使用cx_freeze?

40

按照指示,我创建了setup.py文件,但实际上我并不明白接下来该怎么做。在命令行中键入“python setup.py build”只会得到一个语法错误。

那么,我接下来该怎么做?

setup.py:

from cx_Freeze import setup, Executable

setup(
    name = "On Dijkstra's Algorithm",
    version = "3.1",
    description = "A Dijkstra's Algorithm help tool.",
    exectuables = [Executable(script = "Main.py", base = "Win32GUI")])

1
你能给我们展示一下 setup.py 文件和你的 Python 版本吗? - wkl
2
什么是语法错误?你能贴出一个回溯吗? - aquavitae
@aquavitae 这是在命令行中进行的操作。请问有人能够清楚地告诉我应该在哪里输入"python setup.py build"吗?因为我阅读的说明并没有明确指出。 - Edwin
4
我认为你的问题在于“exectuables”拼写错误,正确应该是“executables”。 - wkl
@birryree:哦...糟糕。好的,我再试一次。 - Edwin
显示剩余2条评论
6个回答

36
  • 在新的首行添加import sys
  • 你在最后一行拼错了"executables"。
  • 删除最后一行的script =

现在代码应该看起来像:

import sys
from cx_Freeze import setup, Executable

setup(
    name = "On Dijkstra's Algorithm",
    version = "3.1",
    description = "A Dijkstra's Algorithm help tool.",
    executables = [Executable("Main.py", base = "Win32GUI")])

使用命令提示符(cmd)运行python setup.py build。(从包含setup.py的文件夹中运行此命令。)注意我们在脚本调用末尾添加的build参数。


2
基础的目的是什么?如果我想让我的可执行文件在多个平台上运行怎么办? - Max

16

我真的不确定你在做什么导致出现那个错误,看起来你是在尝试运行cx_Freeze而没有参数。所以这里是一个简短的分步指南,告诉你如何在Windows上运行它(根据你的截图,它看起来很像Windows命令行,因此我假设这是你的平台)

  1. 编写您的setup.py文件。您上面的脚本看起来正确,所以它应该可以正常工作,只要您的脚本存在。

  2. 打开命令行(开始 -> 运行 -> "cmd"

  3. 转到setup.py文件的位置并运行python setup.py build

注意事项:

  1. 您的脚本名称可能会有问题。 "Main.py" 包含大写字母,这可能会引起混淆,因为Windows的文件名不区分大小写,但Python是区分大小写的。我的方法是始终使用小写字母来避免任何冲突。

  2. 确保Python在您的PATH中(阅读http://docs.python.org/using/windows.html1

  3. 确保查看新的cx_Freeze文档。Google经常会带出旧的文档。


"'python' 不是内部或外部命令,也不是可运行的程序或批处理文件。" - Edwin
Python:无法打开文件'setup.py':[Errno 2]没有那个文件或目录。在输入python时,如预期地获得了Python命令提示符,因此我不理解这个错误。我的文件位于Python31文件夹中。 - Edwin
使用 cd 命令切换到包含你的 setup.py 文件的目录。 - Thomas K
1
@ThomasK:做到了!我以前从未使用过命令行,所以就像个小孩一样需要引导。感谢大家的帮助。 - Edwin

8

我也遇到了类似的问题。我通过将可执行选项设置为一个变量,然后简单地调用该变量来解决它。以下是我使用的示例 setup.py:

from cx_Freeze import setup, Executable
import sys

productName = "ProductName"
if 'bdist_msi' in sys.argv:
    sys.argv += ['--initial-target-dir', 'C:\InstallDir\\' + productName]
    sys.argv += ['--install-script', 'install.py']

exe = Executable(
      script="main.py",
      base="Win32GUI",
      targetName="Product.exe"
     )
setup(
      name="Product.exe",
      version="1.0",
      author="Me",
      description="Copyright 2012",
      executables=[exe],
      scripts=[
               'install.py'
               ]
      ) 

8
你可以将 setup.py 代码更改为以下内容:
    from cx_freeze import setup, Executable
    setup( name = "foo",
           version = "1.1",
           description = "Description of the app here.",
           executables = [Executable("foo.py")]
         )

我相信这会起作用。我已经在Windows 7和Ubuntu 12.04上尝试过了。


3

-1
我通常将调用 setup.py 命令的步骤放入 .bat 文件中以便于召回。 以下是在 COMPILE.BAT 文件中的简单代码:
python setup.py build
@ECHO:
@ECHO    . : ` . *   F I N I S H E D   * . ` : . 
@ECHO:
@Pause

而且setup.py被组织成易于定制的参数,让您设置图标、添加导入模块库:

APP_NAME     = "Meme Studio";      ## < Your App's name
Python_File  = "app.py";     ## < Main Python file to run
Icon_Path    = "./res/iconApp48.ico"; ## < Icon
UseFile      = ["LANGUAGE.TXT","THEME.TXT"];
UseAllFolder = True; ## Auto scan folder which is same level with Python_File and append to UseFile.
Import       = ["infi","time","webbrowser",   "cv2","numpy","PIL","tkinter","math","random","datetime","threading","pathlib","os","sys"];  ## < Your Imported modules (cv2,numpy,PIL,...)

Import+=["pkg_resources","xml","email","urllib","ctypes",   "json","logging"]
################################### CX_FREEZE IGNITER ###################################

from os import walk
def dirFolder(folderPath="./"): return next(walk(folderPath), (None, None, []))[1];  # [ Folder ]
def dirFile(folderPath="./"): return next(walk(folderPath), (None, None, []))[2];  # [ File ]
if UseAllFolder: UseFile += dirFolder();

import sys, pkgutil;
from cx_Freeze import setup, Executable;

BasicPackages=["collections","encodings","importlib"] + Import;
def AllPackage(): return [i.name for i in list(pkgutil.iter_modules()) if i.ispkg]; # Return name of all package
#Z=AllPackage();Z.sort();print(Z);
#while True:pass;
def notFound(A,v): # Check if v outside A
    try: A.index(v); return False;
    except: return True;
build_msi_options = {
    'add_to_path': False,
    "upgrade_code": "{22a35bac-14af-4159-7e77-3afcc7e2ad2c}",
    "target_name": APP_NAME,
    "install_icon": Icon_Path,
    'initial_target_dir': r'[ProgramFilesFolder]\%s\%s' % ("Picox", APP_NAME)
}
build_exe_options = {
    "includes": BasicPackages,
    "excludes": [i for i in AllPackage() if notFound(BasicPackages,i)],
    "include_files":UseFile,
    
    "zip_include_packages": ["encodings"] ##
}
setup(  name = APP_NAME,
        options = {"build_exe": build_exe_options},#"bdist_msi": build_msi_options},#,  
        executables = [Executable(
            Python_File,
            base='Win32GUI',#Win64GUI
            icon=Icon_Path,
            targetName=APP_NAME,
            copyright="Copyright (C) 2900AD Muc",
            )]
);

上面代码中的模块库列表是可用的opencv + pillow + win32应用程序所需的最小列表。

我的项目文件组织示例:

enter image description here

========== 更 新 ==========

尽管 cx_Freeze 是创建安装程序的好方法,但如果您构建多个使用大型库模块(如 opencv、torch、ai 等)的软件项目,则会真正消耗磁盘空间... 有时,用户下载安装程序后,在安装后收到假阳性病毒警报,指向您的 .exe 文件。

因此,您应该考虑使用 SFX 归档 (.exe) 您的应用程序包,并将 SFX Python 包分开以在应用程序项目之间共享。

  • 你可以创建一个.bat文件来启动.py文件,然后使用Microsoft IExpress.exe将.bat文件转换为.exe文件。
  • 接下来,你可以使用Resource Hacker更改.exe图标为自己的图标:http://www.angusj.com/resourcehacker/
  • 然后,使用PeaZip创建你的软件包的SFX归档文件:https://peazip.github.io/
  • 最后更改图标。
  • Python软件包可以打包成.exe文件,并且可以使用.bat文件进行PATH注册,该文件也可以转换为.exe文件。
  • 如果你学习更多关于.bat文件中的命令,并在Resource Hacker和PeaZip & IExpress中进行实验,你可以将你的应用程序项目、Python软件包组合成一个单独的.exe文件。它会自动安装用户机器所需的内容。虽然这种方式更加复杂和困难,但是你可以定制许多安装体验,包括创建桌面快捷方式、安装UI、添加到应用程序和功能列表、卸载能力、便携式应用程序、序列号要求、自定义许可协议、快速窗口运行框等等,但你获得的重要特性是非病毒误报阻止,当用户安装许多你的Python图形应用程序时,减少200MB到多GB。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接