30215


pandasを使ったモジュールをexe化しようとしても上手く行かずに困っています。

[code]

    Traceback (most recent call last):
      File "site-packages\PyInstaller\loader\rthooks\pyi_rth_pkgres.py", line 11, in <module>
      File "c:\users\Username\anaconda3\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module
    exec(bytecode, module.__dict__)
      File "site-packages\setuptools-27.2.0-py3.5.egg\pkg_resources\__init__.py", line 68, in <module>
      File "site-packages\setuptools-27.2.0-py3.5.egg\pkg_resources\extern\__init__.py", line 61, in load_module
      ImportError: The 'appdirs' package is required; normally this is bundled with this package so if you get this warning, consult the packager of your distribution.
    Failed to execute script pyi_rth_pkgres
    
[/code]

環境は  
・Windows10  
・Anaconda(64-bit)

これまで試したこと  
・<https://stackoverflow.com/questions/29109324/pyinstaller-and-pandas>
を参考にspecファイルをいじるも失敗  
・pyinstallerをpipではなくcondaで入れて

[code]

    conda install -c acellera pyinstaller=3.2.3
    
[/code]

を使おうと思っても通常のとどう違うのかわからない

とにかく色々試してみましたが、どうも上手く行きません。  
どうか助けてください


CC BY-SA 3.0
2016-11-05T19:03:56.790
30125
2017-01-28T10:20:53.107
2017-05-23T12:38:55.250
-1
19285
question
python pandas anaconda
anacondaでpandasを使うモジュールをpyinstallerでexe化出来ない


自己解決したので、後続の方たちのために成功時の流れを書きます。  
主に参考にしたのはこのサイトでした  
<http://www.slideshare.net/dondokono/pyconjp-2016>

[code]

    conda create -n 環境名 pywin32 setuptools=19.2 pandas matplotlib
    
[/code]

で仮想環境を構築し、

[code]

    activate 環境名
    
[/code]

で仮想環境を動かします。

[code]

    pip install pyinstaller
    
[/code]

でpyinstallerを仮想環境内にインストールして、作業ディレクトリに移動します。  
ここでとりあえず

[code]

    pyinstaller --onefile 変換ファイル名.py
    
[/code]

と入れると、変換には成功しますが、実行すると

[code]

    Intel MKL FATAL ERROR: Cannot load mkl_avx2.dll or mkl_def.dll
    
[/code]

とでるので、specファイルに

[code]

         a = Analysis(['変換ファイル名.spec'],
             pathex=['C:\\Users\\Username\\作業ディレクトリ'],
             binaries=None,
             datas=[('C:\\Users\\Username\\Anaconda3\\envs\\環境名\\Library\\bin\\mkl_avx2.dll','.'),
                    ('C:\\Users\\Username\\Anaconda3\\envs\\環境名\\Library\\bin\\mkl_def.dll','.')],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
    
[/code]

を追加します。ただ、これだとpandasとかを認識してくれないので、  
<https://stackoverflow.com/questions/29109324/pyinstaller-and-pandas>
を参考に、最終的には

[code]

    # -*- mode: python -*-
    
    block_cipher = None
    
    def get_pandas_path():
        import pandas
        pandas_path = pandas.__path__[0]
        return pandas_path
    
    def get_plt_path():
        import matplotlib
        plt_path = matplotlib.__path__[0]
        return plt_path
    
    a = Analysis(['変換ファイル名.spec'],
         pathex=['C:\\Users\\Username\\作業ディレクトリ'],
         binaries=None,
         datas=[('C:\\Users\\Username\\Anaconda3\\envs\\環境名\\Library\\bin\\mkl_avx2.dll','.'),
                ('C:\\Users\\Username\\Anaconda3\\envs\\環境名\\Library\\bin\\mkl_def.dll','.')],
         hiddenimports=[],
         hookspath=[],
         runtime_hooks=[],
         excludes=[],
         win_no_prefer_redirects=False,
         win_private_assemblies=False,
         cipher=block_cipher)
    
    dict_tree = Tree(get_pandas_path(), prefix='pandas', excludes=["*.pyc"])
    a.datas += dict_tree
    a.binaries = filter(lambda x: 'pandas' not in x[0], a.binaries)
    
    dict_tree = Tree(get_plt_path(), prefix='matplotlib', excludes=["*.pyc"])
    a.datas += dict_tree
    a.binaries = filter(lambda x: 'matplotlib' not in x[0], a.binaries)
    
    
    pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
    exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='変換ファイル名',
          debug=False,
          strip=False,
          upx=True,
          console=True )
    
[/code]

とspecファイルを書き換え

[code]

    pyinstaller 変換ファイル名.spec --onefile
    
[/code]

を実行して無事解決しました。  
ただ、現状exeファイルの起動と実行に時間がかかること  
自分で書いたモジュールのインポートが出来ないのが問題なので、そのうち改善していきたいと思います


CC BY-SA 3.0
2016-11-08T12:15:35.007
30215
2017-01-28T10:20:53.107
2017-05-23T12:38:55.307
-1
19285
30125
answer