元のプログラムは正常に運行して、Pyinstallerはカプセル化した後に運行するエラーの分析


前言
昨日、最近書いたexhentai爬虫プログラムを共有することにしました.この文章を参考にして、よくあるパッケージソフトのプロフィール表を見ました.シロユーザーに使うので、単一のファイル形式にします.Pyinstallerとpy 2 exeの間でそれぞれの公式サイトに行ってみるしかありません.py 2 exeは久しぶりに更新されていません.python 3の新しいバージョンのサポートもあまりよくないので、Pyinstallerでパッケージ/パッケージ化することにしました.ここではPyinstallerのインストールと使用を省略し、症状、分析過程、解決方法と教訓を重点的に説明します.
症状
  • 梱包成功
  • プログラムの実行中に次のエラーが発生しました
  • C:\Users\xoxo\PycharmProjects\Hentai_Spider>main
    Traceback (most recent call last):
      File "main.py", line 6, in 
        from config import args
      File "", line 2237, in _find_and_load
      File "", line 2226, in _find_and_load_unlocked
      File "", line 1200, in _load_unlocked
      File "", line 1129, in _exec
      File "C:\Python34\lib\site-packages\PyInstaller\loader\pyimod03_importers.py",
     line 631, in exec_module
        exec(bytecode, module.__dict__)
      File "config.py", line 11, in 
        parser.add_argument('-sd', '--savedir', default=config['ARGS']['SAVEDIR'])
      File "configparser.py", line 936, in __getitem__
    KeyError: 'ARGS'
    [7836] Failed to execute script main
    
    C:\Users\xoxo\PycharmProjects\Hentai_Spider>

    分析プロセス
    0 . StackOverflow検索してみるとあまり経験がないので参考になりますが...1.main.pyプログラムは完全に走ることができて、このエラーが発生したことがないので、問題がパッケージの過程で発生したことを確定します2.エラーメッセージではconfigを実行する.pyで問題が発生しました3.制御変数排除法(プロセスが煩雑で、一つ一つ列挙しない)によりconfigを読み取ることを決定する.ini時に発生したエラーは、付与config_pathここでは確定した経路に変更すれば正常に動作します
    コードは次のとおりです.
    config = configparser.ConfigParser()
    config_path = os.path.join(os.path.dirname(__file__), CONFIG_FILE)
    config.read(config_path)

    ちなみに私の設計意図はconfig.pyディレクトリの下にあるプロファイルを読み込むmain.pyとconfig.pyは同じディレクトリにあります
    4 . CONFIG_FILEは定数(ファイル名)で、最終的にはosを疑う.path.dirname(__file__)部分5.割り当てconfig_path=この文にprint(os.path.dirname(_file_)を付けると、カプセル化されたファイルがどのディレクトリにあるか見てみると、C:UsersxoxoAppDataLocalTemp_MEI92882になっています
    C:\Users\xoxo\PycharmProjects\Hentai_Spider>main
    C:\Users\xoxo\AppData\Local\Temp\_MEI92882
    Traceback (most recent call last):
      File "main.py", line 6, in 
        from config import args
      File "", line 2237, in _find_and_load
      File "", line 2226, in _find_and_load_unlocked
      File "", line 1200, in _load_unlocked
      File "", line 1129, in _exec
      File "C:\Python34\lib\site-packages\PyInstaller\loader\pyimod03_importers.py",
     line 631, in exec_module
        exec(bytecode, module.__dict__)
      File "config.py", line 12, in 
        parser.add_argument('-sd', '--savedir', default=config['ARGS']['SAVEDIR'])
      File "configparser.py", line 936, in __getitem__
    KeyError: 'ARGS'
    [9296] Failed to execute script main
    
    C:\Users\xoxo\PycharmProjects\Hentai_Spider>

    6.config.pyは、パッケージ前とmain.pyが1つのフォルダの下にあるが、パッケージされた後、実行時に一時フォルダにあり、その際に自身のディレクトリを取る動作に問題があることがわかる
    ソリューション
    main.pyディレクトリ情報をつかんでconfig.py(中関数)に渡す
    教訓
  • パッケージプログラムは設計意図を理解できるほど賢くないので、コードを書くのがもっと賢い
  • ある項目がカプセル化される可能性がある場合、カプセル化されたプログラムにディレクトリ情報をキャプチャする
  • を伝達させる.