web-dev-qa-db-ja.com

cx_Freezeとtkinterを使用すると、「DLLの読み込みに失敗しました:指定されたモジュールが見つかりませんでした」と表示されます。 (Python 3.5.3)

Cx_FreezeとTkinterを使用すると、次のメッセージが表示されます。

File "C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 35, in <module>
import _tkinter # If this fails your Python may not be configured for Tk
ImportError: DLL load failed: The specified module could not be found.

注意すべき点:

  • Python 3+(現在3.5.3、32ビットを使用しています)を使用したいのですが、機能するものは何でも、特定のバージョンについては特に気にしないでください。
  • 私のプロジェクトには、コンパイルする必要のある複数のファイルがあります。私の知る限り、これでcx_FreezeまたはNuitkaが残ります。 Nuitkaには独自の問題がありました。
  • Windows 10 Home Edition、64ビットを使用しています

これが私の現在のsetup.pyです:

from cx_Freeze import setup, Executable    
import sys  

build_exe_options = {"packages": ["files", "tools"]}  

base = None    
if sys.platform == "win32":    
    base = "Win32GUI"    

setup(name="Name",  
      version="1.0",  
      description="Description",  
      options={"build_exe": build_exe_options},  
      executables=[Executable("main.py", base=base)],  
      package_dir={'': ''},  
      )

私はインターネットの隅々から多くの解決策を試しました。含むがこれらに限定されません:

  • python(および対応するcx_Freeze/Tkinterバージョン)の複数のバージョン
  • 32ビット版と64ビット版の両方
  • Tkinterをeasyguiで置き換える(明らかにeasyguiはTkinterが機能する必要がある)
  • PATH変数の確認
  • コンピュータを再起動する(何を期待していたかわからない)
  • pythonの他のバージョンのアンインストールと正しいバージョンの修復
  • 私のコンパイルbatファイルに以下を配置する(間違いなく正しいパス):

    set TCL_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\tcl\tcl8.6
    set TK_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\tcl\tk8.6
    
  • 私のsetup.pyに以下を配置します:

    options={"build_exe": {"includes": ["tkinter"]}}
  • に加えて:
    include_files = [r"C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\DLLs\tcl86t.dll",\
                     r"C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\DLLs\tk86t.dll"]

(そしてはい、それらは何らかの方法でsetup()に含まれていました)


助けてくれてありがとう、それは大いに感謝しています。そして、はい、私はこのサイトでこの問題のほとんどすべての解決策を見てきました。問題が解決しないようですので、誰かが別の解決策を見つけるのを助けてくれることを願っています。

10
Reece Mathews

解決策を見つけました!

pythonディレクトリのDLLフォルダーから、コンパイルしようとしているmain.pyを含むビルドフォルダーに、tk86t.dllおよびtcl86t.dllファイルをコピーする必要がありました。

これは、

set TCL_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35\tcl\tcl8.6  
set TK_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35\tcl\tk8.6

私のcompile.batの上部にあり、
"include_files": ["tcl86t.dll", "tk86t.dll"]
setup.pyのbuild_exe_optionsで、トリックを実行したようです。

これが私の現在のsetup.pyです:

from cx_Freeze import setup, Executable  
import sys  

build_exe_options = {"packages": ["files", "tools"], "include_files": ["tcl86t.dll", "tk86t.dll"]}  

base = None  
if sys.platform == "win32":  
    base = "Win32GUI"  

setup(name="Name",  
    version="1.0",  
    description="Description",  
    options={"build_exe": build_exe_options},  
    executables=[Executable("main.py", base=base)],  
    package_dir={'': ''},  
    )  

そして、これが私のcompile.batです(すべてのステップを表示するように更新されています)。

@echo off
set TCL_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python36-32\tcl\tcl8.6
set TK_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python36-32\tcl\tk8.6
RD /S /Q "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin"
mkdir "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin"
xcopy /s "C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python36-32\DLLs\tcl86t.dll" "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin\tcl86t.dll"
xcopy /s "C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python36-32\DLLs\tk86t.dll" "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin\tk86t.dll"
cd "C:\Users\VergilTheHuragok\Desktop\PythonProject\"
cxfreeze main.py --target-dir "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin" --target-name "launch.exe"
pause  

この解決策を見つけました here

17
Reece Mathews

これらの問題を修正した後でも、cx_freezeはpandas(つまりnumpy)の依存関係をインポートできませんでした。これを修正するために、フォルダ全体を文字通りコピーしてコンパイルしようとした.pyファイルのディレクトリ。実行可能ファイルは同じディレクトリにある必要があるため(スタンドアロンである必要はありません)、pandasおよびnumpy

0
Matthew Steffen

image

この問題を解決するには、ファイル1.tcl86t.dll 2.tk86t.dllをこのパスC:\ Users\h280126\AppData\Local\Programs\Python\Python36-32\DLLsからコピーし、.exeパスCに配置します。\Users\h280126\PycharmProjects\my_tool\build\exe.win32-3.6正常に動作しています:)

0
Madhu Reddy