2016-09-07 74 views
0

我有一個簡單的程序,接受來自用戶的輸入,然後用硒進行刮擦。由於用戶沒有安裝Python環境,我想將其轉換爲* .exe。我通常使用cx_freeze,並已成功將.py程序轉換爲.exe。起初它缺少一些模塊(如lxml),但我能夠解決它。現在我想我只有docx包的問題。cx_freeze和docx - 凍結時出現問題

這是我如何開始新的文件在我的節目(我猜這是什麼原因造成我的問題):

doc = Document() 
#then I do some stuff to it and add paragraph and in the end... 
doc.save('results.docx') 

當我運行它從Python的一切工作正常,但是當我轉換成exe文件,我得到這個錯誤:

Traceback (most recent call last): 
    File "C:\Users\tyszkap\AppData\Local\Continuum\Anaconda3\lib\site-packages\cx_Freeze\initscripts\Console.py", line 27, in <module> 

    exec(code, m.__dict__) 
    File "tribunalRio.py", line 30, in <module> 
    File "C:\Users\tyszkap\AppData\Local\Continuum\Anaconda3\lib\site-packages\docx\api.py", line 25, in Document 
    document_part = Package.open(docx).main_document_part 
    File "C:\Users\tyszkap\AppData\Local\Continuum\Anaconda3\lib\site-packages\docx\opc\package.py", line 116, in open 
    pkg_reader = PackageReader.from_file(pkg_file) 
    File "C:\Users\tyszkap\AppData\Local\Continuum\Anaconda3\lib\site-packages\docx\opc\pkgreader.py", line 32, in from_file 
    phys_reader = PhysPkgReader(pkg_file) 
    File "C:\Users\tyszkap\AppData\Local\Continuum\Anaconda3\lib\site-packages\docx\opc\phys_pkg.py", line 31, in __new__ 
    "Package not found at '%s'" % pkg_file 
docx.opc.exceptions.PackageNotFoundError: Package not found at 'C:\Users\tyszkap\Dropbox (Dow Jones)\Python Projects\build\exe.win-a 
md64-3.4\library.zip\docx\templates\default.docx' 

這是我的setup.py程序:

from cx_Freeze import setup, Executable 

executable = Executable(script = "tribunalRio.py") 

# Add certificate to the build 
options = { 
    "build_exe": {'include_files' : ['default.docx'], 
     'packages' : ["lxml._elementpath", "inspect", "docx", "selenium"] 
    } 
} 

setup(
    version = "0", 
    requires = [], 
    options = options, 
    executables = [executable]) 

我認爲明確地向包中添加default.docx將解決問題(我甚至嘗試將它添加到library.zip,但它給了我更多的錯誤),但它沒有。我已經看到了這post但我不知道他們是什麼意思由:

copying the docx document.py module inside my function (instead of using Document()

任何想法?我知道,冰凍是不是最好的解決辦法,但我真的不希望建立一個web界面對於這樣一個簡單的程序......

編輯:

我剛纔想this solution

def find_data_file(filename): 
    if getattr(sys, 'frozen', False): 
     # The application is frozen 
     datadir = os.path.dirname(sys.executable) 
    else: 
     # The application is not frozen 
     # Change this bit to match where you store your data files: 
     datadir = os.path.dirname(__file__) 

    return os.path.join(datadir, filename) 

doc = Document(find_data_file('default.docx')) 

但再次收到回溯錯誤(但該文件是在此位置...):

Traceback (most recent call last): 
    File "C:\Users\tyszkap\AppData\Local\Continuum\Anaconda3\lib\site-packages\cx_Freeze\initscripts\Console.py", line 27, in <module> 

    exec(code, m.__dict__) 
    File "tribunalRio.py", line 43, in <module> 
    File "C:\Users\tyszkap\AppData\Local\Continuum\Anaconda3\lib\site-packages\docx\api.py", line 25, in Document 
    document_part = Package.open(docx).main_document_part 
    File "C:\Users\tyszkap\AppData\Local\Continuum\Anaconda3\lib\site-packages\docx\opc\package.py", line 116, in open 
    pkg_reader = PackageReader.from_file(pkg_file) 
    File "C:\Users\tyszkap\AppData\Local\Continuum\Anaconda3\lib\site-packages\docx\opc\pkgreader.py", line 32, in from_file 
    phys_reader = PhysPkgReader(pkg_file) 
    File "C:\Users\tyszkap\AppData\Local\Continuum\Anaconda3\lib\site-packages\docx\opc\phys_pkg.py", line 31, in __new__ 
    "Package not found at '%s'" % pkg_file 
docx.opc.exceptions.PackageNotFoundError: Package not found at 'C:\Users\tyszkap\Dropbox (Dow Jones)\Python Projects\build\exe.win-a 
md64-3.4\default.docx' 

我在做什麼錯?

+0

您可能需要查看docx包中的代碼,以瞭解它的期望。你可能已經解決了問題,但還有另一個期望,你需要在它開心之前完成。 :-) –

+0

凍結真的很痛......:D – pawelty

+0

是的。 *特別是*當那些寫軟件包不關心自己以任何方式凍結,並假設文件位於磁盤上的位置! –

回答

0

我有同樣的問題,並設法通過執行以下操作。首先,我找到site-packages中的default.docx文件。然後,我將它複製到我的.py文件所在的目錄中。我還啓動了帶有Document()的.docx文件,該文件有一個docx = ...標誌,我爲其分配了值:os.path.join(os.getcwd(), 'default.docx'),現在看起來像doc = Document(docx=os.path.join(os.getcwd(), 'default.docx'))。最後一步是將文件包含在凍結過程中。 Etvoilà!到目前爲止,我沒有問題。