我有一個簡單的程序,接受來自用戶的輸入,然後用硒進行刮擦。由於用戶沒有安裝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'
我在做什麼錯?
您可能需要查看docx包中的代碼,以瞭解它的期望。你可能已經解決了問題,但還有另一個期望,你需要在它開心之前完成。 :-) –
凍結真的很痛......:D – pawelty
是的。 *特別是*當那些寫軟件包不關心自己以任何方式凍結,並假設文件位於磁盤上的位置! –