2016-09-07 2 views
0

ユーザーからの入力を受けてから、セレンを使ってスクレイピングする簡単なプログラムがあります。ユーザーにはPython環境がインストールされていないので、* .exeに変換したいと思います。私は通常cx_freezeを使っています。私は.pyプログラムを.exeに変換しました。最初は、いくつかのモジュール(lxmlなど)が欠けていましたが、解決できました。今私はdocxパッケージに問題があると思う。cx_freezeとdocx - フリーズ時の問題

これは私が私のプログラムで新しい文書(私はこれが私の問題を引き起こすものであると思います)を開始する方法である:正常に動作しますが、私はexeファイルに変換するときに私が取得私はPythonのすべてからそれを実行すると

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

をこのエラーは:私はと考え

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]) 

:これは私のsetup.pyプログラム

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' 

ある

パッケージにdefault.docxを明示的に追加すると問題が解決します(私はlibrary.zipに追加しようとしましたが、さらにエラーが出ます)。私はこの postを見てきましたが、私は、彼らが何を意味知っていない:

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

任意のアイデア?私は凍結が最善の解決策ではないことを知っているが、私は本当にこのような単純なプログラムのためのWebインターフェイスを構築したくない...

EDIT:

私はちょうど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

予想される位置にデフォルトのDocument()テンプレートを配置しないで、フリーズ操作に問題があることがわかります。 Python-docxパッケージにパッケージデータとしてdocx/templates/default.docxとして保存されています(setup.pyはこちらを参照してください:https://github.com/python-openxml/python-docx/blob/master/setup.py#L37

私はあなたのケースでそれを修正する方法はわかりませんが、それは問題のようです。

0

私は同じ問題を抱えており、次のようにして回避することができました。まず、default.docxファイルをsite-packagesに配置しました。その後、私の.pyファイルと同じディレクトリにコピーしました。また、Document()のdocx = ...フラグを持つ.docxファイルを開始します。このファイルには、os.path.join(os.getcwd(), 'default.docx')の値が割り当てられていて、今度はdoc = Document(docx=os.path.join(os.getcwd(), 'default.docx'))のように見えます。最後のステップは、ファイルをフリーズプロセスに含めることでした。 Etvoilà!これまでのところ問題はありません。

関連する問題