2012-08-03 26 views
12

這又拿出了好幾次在cx_Freeze郵件列表移動所有的DLL和PYD到子文件夾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

查看[ConsoleSetLibPath](https://bitbucket.org/anthony_tuininga/cx_freeze/src/default/cx_Freeze/initscripts/ConsoleSetLibPath.py)initscript。應該可以調整以查找子文件夾中的庫。 – 2014-01-08 17:26:55

+0

你如何使用這個initscript?它看起來很有希望,但我不知道如何整合它。 – ibell 2014-01-08 20:01:22

+0

如果您使用的是setup.py腳本,請爲'build_exe'指定'init_script'選項([docs](http://cx-freeze.readthedocs.org/en/latest/distutils)。HTML#集結EXE))。或者如果您使用'cxfreeze'命令,則會有[--init腳本標誌](http://cx-freeze.readthedocs.org/en/latest/script.html#cmdoption--init-script) 。 – 2014-01-08 22:43:52

回答

3

我明白你的沮喪。我傾向於採取整個構建文件夾,並將其移動到程序文件目錄,假設您使用的是Windows機器。然後在桌面上爲可執行文件創建一個快捷方式。然後,我通常會將圖標更改爲令人滿意的內容。換句話說,所有的系統文件都是隱藏的,你只剩下一個在桌面上的好看的圖標。

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\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中測試這個,它的工作,但它的行爲怪異,我的非阻塞閱讀按鍵代碼無法正常工作。不確定哪部分是錯誤的。

+0

不,我不認爲現在沒有編輯腳本的選項。 – 2014-03-09 19:17:36

+0

順便說一下,在修改'LD_LIBRARY_PATH'的頂部部分,我想你可能需要將'paths.insert(0,DIR_NAME)'行改爲'paths.insert(0,os.path.join(DIR_NAME ,'lib'))'。不過,這隻會影響Unix系統。對於Windows,我認爲您可能需要將相同的目錄添加到'PATH'環境變量。 – 2014-03-09 19:23:16

+0

「DIR_NAME」來自哪裏?我在'os.environ [「LD_LIBRARY_PATH」] = os.pathsep.join(路徑)''上得到一個錯誤,因爲這個值太長了。這似乎很奇怪,因爲在Windows上這應該是'lib',三個字符。 – ToothlessRebel 2015-10-17 23:09:33

相關問題