这在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文件夹或其他内容,然后重新设置共享库加载路径以帮助它找到动态库(如果可能的话)。或类似的东西。
由于
答案 0 :(得分:3)
我理解你的沮丧。我倾向于采取整个构建文件夹并将其移动到程序文件目录,假设您使用的是Windows机器。然后在桌面上创建一个可执行文件的快捷方式。然后我通常会将图标更改为令人赏心悦目的东西。换句话说,所有系统文件都是隐藏的,而您剩下的只是桌面上一个漂亮的图标。
答案 1 :(得分:3)
“手动”做到了,但这是正确的方法吗?我在win7 x64 cx_freeze 4.3.2
我的init_script,来自Console.py
和ConsoleSetLibPath.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\initscripts
ConsoleSetLibPathx.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中测试它时,它正在工作,但它表现得很奇怪,我的非阻塞读取按键代码无法正常工作。不确定哪个部分是错的。