2016-08-10 3 views
2

私はPythonスクリプトの実行ファイルを作成するためにPyInstallerをインストールしました。私はPyPandocを使って.docxのレポートを作成しました。通常のpythonファイルを実行すると正常に実行されますが、実行可能なPyInstallerでは実行されません。それはエラーを与える:PyPandocとPyInstallerの組み合わせ

Traceback (most recent call last): 
    File "src\flexmodel_postcalc.py", line 295, in postcalculate_everything 
    File "src\flexmodel_postcalc.py", line 281, in generate_report_docx 
    File "src\flexmodel_report_docx.py", line 118, in generate_text_useages_docx 
    File "pypandoc\__init__.py", line 50, in convert 
    File "pypandoc\__init__.py", line 70, in _convert 
    File "pypandoc\__init__.py", line 197, in get_pandoc_formats 
    File "pypandoc\__init__.py", line 336, in _ensure_pandoc_path 
OSError: No pandoc was found: either install pandoc and add it 
to your PATH or install pypandoc wheels with included pandoc. 

私はPyPandocに関する奇妙な問題を参照してください。実行可能ファイルにPandocを含めるにはどうすればいいですか?(PythonやPandocをインストールしない)他の人が実行可能ファイルを使用して.docxレポートを作成できますか?

編集:作業工程は、以下のステップを含む:

  1. は、次のコードを含むファイルを作成します。pythonfile.py

  2. として

    import pypandoc 
    pypandoc.convert(sou‌​rce='# Sample title\nPlaceholder', to='docx', format='md', outputfile='test.doc‌​x') 
    
  3. 保存、このファイルを実行可能ファイルを作成しますPyInstaller:

    pyinstaller --onefile --clean pythonfile.py 
    
  4. 実行ファイルは、Pandoc(またはPyPandoc)がインストールされていないコンピュータで実行する必要があります。

+1

Pythonスクリプトの最小の実例を追加して、使用しているpandocの部分を確認できますか?私は 'pypandoc'のみで試してみましたが、私のWindowsシステムで正常に動作しているようです。おそらく、あなたは[隠しインポート](https://pythonhosted.org/PyInstaller/when-things-go-wrong.html#listing-hidden-imports)と他のいくつかの依存関係に 'pypandoc'を追加する必要があります。 – Repiklis

+0

@Repiklis私は非常に短いサンプルコードを与えることができますが、今はテストしません。 'import pypandoc; pypandoc.convert(source = '#サンプルタイトル\ nプレースホルダー'、to = 'docx'、format = 'md'、outputfile = 'test.docx') 'これは '.py'ファイルに保存されます。これは' pyinstaller --onefile --clean -p H:\ AppData \ Python \ Python27 \ Lib \ site-packages pythonfile.py'コマンドで変換します。 – Mathias711

+0

投稿してください他の人があなたの問題を理解できるように質問のサンプルコード私は以下の答えを投稿します。 – Repiklis

答えて

3

ここには2つの問題があります。最初は、pypandocにはpandoc.exeが必要です。これは自動的にpyinstallerによって選択されませんが、手動で指定することはできます。

これを行うには、create a .spec fileが必要です。一つは私が生成され、このようなルックスを使用:

block_cipher = None 

a = Analysis(['pythonfile.py'], 
      pathex=['CodeDIR'], 
      binaries=[], 
      datas=[], 
      hiddenimports=[], 
      hookspath=[], 
      runtime_hooks=[], 
      excludes=[], 
      win_no_prefer_redirects=False, 
      win_private_assemblies=False, 
      cipher=block_cipher) 
pyz = PYZ(a.pure, a.zipped_data, 
      cipher=block_cipher) 
exe = EXE(pyz, 
      a.scripts, 
      a.binaries, 
      a.zipfiles, 
      a.datas, 
      name='EXEName', 
      debug=False, 
      strip=False, 
      upx=True, 
      console=True , 
      resources=['YourPandocLocationHere\\\\pandoc.exe']) 

あなたはpyinstaller myspec.specを使用して実行可能ファイルを構築することができます。パスとnameパラメータを変更することを忘れないでください。

これをディレクトリモードで構築する場合は、これで十分です。しかし、one-fileモードの場合、pyinstaller bootloader processが動作するため、状況は少し複雑になります。 pandoc.exeファイルは一時フォルダで実行中に解凍されますが、実行は元の.exeフォルダで行われます。 this questionによれば、フリーズしたコードを実行する場合は、現在のフォルダを変更するためにpypandocを呼び出す前に、コードに次の行を追加する必要があります。

if hasattr(sys, '_MEIPASS'): 
    os.chdir(sys._MEIPASS) 
+0

これを投稿していただきありがとうございます。何らかの理由で '-p'引数が動作していないのですが、少なくとも正しい軌道に乗っています。ありがとう! – Mathias711

+0

'.spec'ファイルの最後に[' collect'ブロック](https://pythonhosted.org/PyInstaller/spec-files.html#spec-file-operation)を追加する必要があります。 「1つのdir」。 – Repiklis

+0

'resources'引数はリストではないはずですか?私はisでTypeErrorを取得し、 '[] 'がなければ動作します。今後の参考として、 'pathex'引数(そのリストの新しい項目)に' -p'引数のフォルダを含めました。 – Mathias711

関連する問題