【问题标题】:Moving all the DLL and PYD to a sub-folder with cx_Freeze使用 cx_Freeze 将所有 DLL 和 PYD 移动到子文件夹
【发布时间】:2012-08-01 23:14:09
【问题描述】:

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

(见

cx_Freeze and moving files around

Creating fewer files when freezing a Python application

cx_freeze python single file? )

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

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

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

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

谢谢

【问题讨论】:

  • 看看ConsoleSetLibPath initscript。应该可以对其进行调整以在子文件夹中查找库。
  • 你如何使用那个初始化脚本?它看起来很有前途,但我不知道如何集成它。
  • 如果您使用 setup.py 脚本,请为 build_exe (docs) 指定 init_script 选项。或者,如果您使用cxfreeze 命令,则有一个--init-script flag

标签: python cx-freeze


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    “手动”做到了,但这是正确的方法吗?我在 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.py 和我的 setup.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 中测试它时,它正在工作,但它的行为很奇怪,我的非阻塞读取按键代码不起作用。不知道哪一部分错了。

    【讨论】:

    • 不,我不认为目前没有编辑 initscript 的选项。
    • 顺便说一句,在顶部修改LD_LIBRARY_PATH的部分中,我认为您可能需要将paths.insert(0, DIR_NAME)这一行更改为paths.insert(0, os.path.join(DIR_NAME, 'lib'))。不过,这只影响 Unix 系统。对于 Windows,我认为您可能需要将相同的目录添加到 PATH 环境变量中。
    • DIR_NAME 来自哪里?我在os.environ["LD_LIBRARY_PATH"] = os.pathsep.join(paths) 行收到一个错误,因为该值太长。这看起来很奇怪,因为在 Windows 上这应该是 lib,三个字符。
    • 我只能让 initscript 像这样工作:Executable(..., initScript='foo') 在最新版本的 cx_Freeze 中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    相关资源
    最近更新 更多