54703
お世話になります。  
PyInstallerでDLLやPYDファイルの保存先ディレクトリを変更したいと考えています。  
一応下記の英語版にある質問の1番目の回答で、とりあえず、実現できることは確認できました。  
[python - pyInstaller changing dll and pyd output
location](https://stackoverflow.com/questions/19579979/pyinstaller-changing-
dll-and-pyd-output-location)  
ですが、この方法を用いてもWxPythonを利用したプログラムで、WxPythonのDLLの保存先を変更することはできないようです。  
環境はWindows10、Python3.7です。  
長くなりますが、スクリプトと実行したコマンド、エラー内容を記載します。

## スクリプト

下記スクリプトを「clock.py」として作成する。

```

    import wx
    from datetime import datetime
    from pubsub import pub
    from time import sleep
    from threading import Thread
    
    class mainFrame(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, None, -1, size = wx.Size(800, 400))
            self.SetTitle("時計")
            mainScreen(self)
    
    class mainScreen(wx.Panel):
        def __init__(self, parent):
            wx.Panel.__init__(self, parent, -1)
            self.parent = parent
    
            self.clock_label = wx.StaticText(self, -1, "時刻")
            self.clock_text = wx.TextCtrl(self, -1, "", style=wx.TE_READONLY)
    
            vSizer = wx.BoxSizer(wx.VERTICAL)
            vSizer.Add(self.clock_label, 0)
            vSizer.Add(self.clock_text, 0)
            self.SetSizer(vSizer)
            self.clock_text.SetFocus()
            pub.subscribe(self.update_clock, "time_changed")
            self.clock_thread = Thread(target=self.clock_start)
            self.clock_thread.setDaemon(True)
            self.clock_thread.start()
    
        def clock_start(self):
            while True:
                now = datetime.now()
                wx.CallAfter(pub.sendMessage, "time_changed", msg="%s:%s:%s" % (now.hour, now.minute, now.second))
                sleep(0.1)
    
        def update_clock(self, msg):
            self.clock_text.SetValue(msg)
    
    app = wx.App(redirect=False)
    MyApp = mainFrame()
    MyApp.Show(True)
    app.MainLoop()
    
```

## 実行内容

  1. 下記内容を「hook.py」として「clock.py」と同じフォルダに保存する。

import sys  
import os  
sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), "libs"))

  2. コマンドプロンプトを開いて、下記コマンドで実行ファイルを作成する。  
なお、ディレクトリが「clock.py」の保存ディレクトリでない場合は、適宜「cd」コマンドで移動する。

pyinstaller --clean --log-level WARN --runtime-hook hook.py clock.py

  3. 「clock.py」のフォルダ内の「dist\clock」フォルダへ移動する。

  4. 「libs」フォルダを作成し、「python37.dll」以外のファイルを、先ほど作成した「libs」フォルダへ移動する。
  5. コマンドプロンプトを開いて、「clock.exe」を実行する。  
なお、ディレクトリが「clock.exe」の保存ディレクトリでない場合は、適宜「cd」コマンドで移動する。

  6. すると、下記のエラーが発生する。

## エラー内容

```

    Traceback (most recent call last):
      File "clock.py", line 1, in <module>
      File "C:\Python37\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 627, in exec_module
        exec(bytecode, module.__dict__)
      File "site-packages\wx\__init__.py", line 17, in <module>
      File "C:\Python37\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 627, in exec_module
        exec(bytecode, module.__dict__)
      File "site-packages\wx\core.py", line 12, in <module>
    ImportError: DLL load failed: 指定されたモジュールが見つかりません。
    [12296] Failed to execute script clock
    
```

## 補足

試しに「wx」フォルダも「libs」フォルダに移動してみましたが、変化なしでした。

* * *

何かよい方法があれば、アドバイスいただけると幸いです。  
それとも「wx*.dll」を移動するのは難しいのでしょうか。  
よろしくお願いします。
CC BY-SA 4.0
2019-05-02T13:56:38.883
54660
2019-05-04T02:10:20.337
2019-05-03T06:10:40.040
3060
29034
question
python python3 windows
PyInstallerでDLL等の保存先を変更したい
おそらく難しいと思われます。  
該当のエラーが発生した行は以下の内容になっていて、フォルダ名に相当する部分まで明示的に指定されているようです。

```

    File "site-packages\wx\__init__.py", line 17, in <module>
    
```

17行目はこれです。

```

    from wx.core import *
    
```

他の `__init__.py` のわずかな行数でも、色々とフォルダが固定で指定されている感じがします。

```

    # Name:        wx/__init__.py
    
    import wx.__version__
    __version__ = wx.__version__.VERSION_STRING
    
```

* * *
```

    File "site-packages\wx\core.py", line 12, in <module>
    
```

12行目はこれです。

```

    from ._core import *
    
```

で、おそらく上記に該当するのが、作成された wx フォルダ内の `_core.cp37-win_amd64.pyd` でしょう。  
他に類似で以下の import があります。

```

    import wx.siplib
    
```

同じく該当すると思われるのが、`siplib.cp37-win_amd64.pyd` でしょう。

* * *

何か変更できるとしたら、以下の2つが考えられます。

  1. 3つある「wx*.dll」を wx フォルダに移動する。  
ここに移動した場合は動作するようです。

  2. 作成時のオプションに `--onefile` を指定して、1つのexeファイルとし、  
その内部のフォルダ/ファイル構成は気にしない。
CC BY-SA 4.0
2019-05-04T02:10:20.337
54703
2019-05-04T02:10:20.337
26370
54660
answer