12

这在 cx_Freeze 邮件列表中出现了很多次

(看

cx_Freeze 和移动文件

冻结 Python 应用程序时创建的文件更少

cx_freeze python 单个文件? )

在我看来,这应该是一个简单的修复,但我不知道如何开始。

我有一个 python 应用程序,它依赖于 scipy、wxpython、numpy 和一堆其他包,每个包都有很多动态链接库。主要的可执行文件夹被 PYD 和 DLL 文件弄得非常混乱,甚至很难在所有文件中找到可执行文件。我的用户不是特别精通计算机,因此清晰度非常重要。

我不需要像理论上可以由 bbfreeze 生成的单个可执行文件。我喜欢 distutils setup.py 文件如何与 cx_Freeze 一起工作,并且在其他方​​面 cx_Freeze 非常出色。

我想要的只是一种清理主可执行文件夹的方法。如果可能的话,我会非常高兴手动将 DLL 文件移动到 freeze_libs 文件夹或其他东西,然后修改共享库加载路径以帮助它找到动态库。或类似的东西。

谢谢

4

2 回答 2

3

“手动”做到了,但这是正确的方法吗?我在 win7 x64 cx_freeze 4.3.2

我的 init_script,结合自Console.pyConsoleSetLibPath.py

import encodings
import os
import sys
import warnings
import zipimport

paths = os.environ.get("LD_LIBRARY_PATH", "").split(os.pathsep)
if DIR_NAME not in paths:
    paths.insert(0, DIR_NAME)
    os.environ["LD_LIBRARY_PATH"] = os.pathsep.join(paths)
    os.execv(sys.executable, sys.argv)

sys.frozen = True
sys.path = sys.path[:4]

# i added this line
sys.path.append(r'lib')

os.environ["TCL_LIBRARY"] = os.path.join(DIR_NAME, "tcl")
os.environ["TK_LIBRARY"] = os.path.join(DIR_NAME, "tk")

m = __import__("__main__")
importer = zipimport.zipimporter(INITSCRIPT_ZIP_FILE_NAME)

# The following if/else is copied from ConsoleSetLibPath.py
if INITSCRIPT_ZIP_FILE_NAME != SHARED_ZIP_FILE_NAME:
    moduleName = m.__name__
else:
    name, ext = os.path.splitext(os.path.basename(os.path.normcase(FILE_NAME)))
    moduleName = "%s__main__" % name

code = importer.get_code(moduleName)
exec code in m.__dict__

versionInfo = sys.version_info[:3]
if versionInfo >= (2, 5, 0) and versionInfo <= (2, 6, 4):
    module = sys.modules.get("threading")
    if module is not None:
        module._shutdown()

然后我将此文件保存在我C:\Python27\Lib\site-packages\cx_Freeze\initscriptsConsoleSetLibPathx.pysetup.py 中

setup(
    name = 'xxx',
    version = '0.1',
    options = {'build_exe': {'includes':includes,
                             'excludes':excludes,
                             'packages':packages,
                             'include_files':includefiles,
                             'create_shared_zip':True,
                             'include_in_shared_zip':True,
                              # use the "hacked" init_script ?
                             'init_script':'ConsoleSetLibPathx',
                             'include_msvcr':True,
                             }

                             }, 
    executables = [exe]
)

# Am i supposed to do the mkdir lib , and copy *.pyd *.dll into it in the end of this setup.py here? 
# I verified this is working by manually creating lib dir and copy all files inside, it works.

我觉得我应该在选项中或某个地方这样做,但现在不太了解 cx_freeze 文档。也许 --target-dir 或 --default-path 或 --replace-paths ?不知道如何使用它们

编辑:抱歉,这需要改进,当我在 vmware 中的另一个干净的 win7 中测试它时,它正在工作,但它的行为很奇怪,我的非阻塞读取按键代码不起作用。不确定哪个部分是错误的。

于 2014-03-08T07:44:21.640 回答
3

我理解你的沮丧。假设您使用的是 Windows 机器,我倾向于将整个构建文件夹移动到程序文件目录中。然后在桌面上创建可执行文件的快捷方式。然后,我通常将图标更改为令人赏心悦目的东西。换句话说,所有系统文件都被隐藏了,剩下的只是桌面上一个漂亮的图标。

于 2014-01-07T20:59:20.933 回答