6

私は PyInstaller を使用して、2 つのスクリプトを 1 つの実行可能ファイルに変換し、そのうちの 1 つが他のスクリプトを呼び出します。私が抱えている問題は、2 つのスクリプトをバンドルして相互に参照させる方法がわからないことです。

問題の原因となるコードは、1 つのスクリプトに次のものscript1.pyが含まれていることです。

subprocess.call(['gksudo','python script2.py'])

これは、スクリプトを通常どおり実行すると正常に機能しますが、PyInstaller にパッケージ化されると、呼び出しを機能させる方法がわかりません。

4

1 に答える 1

1

pyinstaller がこの種のバンドルを単独で処理できるとは思いません。少なくとも、可能であれば構成できませんでした。私はまた、いくつかの呼び出しを行うかなり大きなアプリケーションを持っています

subprocess.Popen('python' ... )

完了しました。私が最終的にそれを機能させた方法は次のとおりです。

  1. のように、サブプロセス呼び出しを別の python に変更しますsubprocess.call(['gksudo','./python script2.py'])。あなたの場合、エントリポイント用と残りのスクリプト用の 2 つの個別の分析を作成します。

    a1 - script1.py の分析 a2 - script2.py の分析

  2. エントリ ポイント スクリプトからのみ exe を作成します。

    pyz = PYZ(a1.pure)
    exe = EXE(pyz,
      a1.scripts,
      exclude_binaries=1,
      name={name here},
      debug=False,
      strip=False,
      upx=True,
      console=1 )
    
  3. すべてのスクリプトから収集

        coll = COLLECT( exe,
           a1.binaries,
           a1.zipfiles,
           a1.datas,
           a2.binaries,
           a2.zipfiles,
           a2.datas,
       python_tree, 
           *additional_trees,
           strip=False,
           upx=True,
           name={})
    
  4. すべてのサブプロセス呼び出しで指定された場所にあるディストリビューションの python を、pyinstaller で見つからなかった追加の要件とともにコピーします (matplotlib、pylab などのようなものがいくつかありました)。

  5. 最初に必要な環境変数をパッケージを指すように変更してからアプリを起動する起動スクリプトを作成します。私の場合、必要だったのは、呼び出し元のディレクトリから:

     export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
     export LD_RUN_PATH=`pwd`:$LD_RUN_PATH
    

Python がインストールされていないマシンでアプリケーションを実行する場合、または Python がインストールされている場合は、アプリがローカル ライブラリではなく配布パッケージのすべてのライブラリを引き続き使用するようにする場合、これらすべてが必要になりました。あなたの場合、Pythonがターゲットマシンに既にインストールされている場合、このようなことは必要ないと思います。最初の3つのステップで十分です。

于 2012-01-17T09:08:08.047 に答える