web-dev-qa-db-ja.com

KeyError:cx_Freezeを使用すると「TCL_Library」

cx_Freezeを使用すると、pygameプログラムのビルド中にkeyerror KeyError: 'TCL_Library'が発生します。なぜこれを入手し、どうすれば修正できますか?

私のsetup.pyは以下です:

from cx_Freeze import setup, Executable

setup(
    name = "Snakes and Ladders",
    version = "0.9",
    author = "Adam",
    author_email = "Omitted",
    options = {"build_exe": {"packages":["pygame"],
                         "include_files": ["main.py", "squares.py",
                         "pictures/Base Dice.png", "pictures/Dice 1.png",
                         "pictures/Dice 2.png", "pictures/Dice 3.png",
                         "pictures/Dice 4.png", "pictures/Dice 5.png",
                         "pictures/Dice 6.png"]}},
    executables = [Executable("run.py")],
    )
46
Orange1861

環境変数を手動で設定することにより、このエラーを回避できます。

set TCL_LIBRARY=C:\Program Files\Python35-32\tcl\tcl8.6
set TK_LIBRARY=C:\Program Files\Python35-32\tcl\tk8.6

setup.pyスクリプトでそれを行うこともできます。

os.environ['TCL_LIBRARY'] = r'C:\Program Files\Python35-32\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\Program Files\Python35-32\tcl\tk8.6'

setup([..])

しかし、実際にプログラムを実行しても機能しないことがわかりました。 cx_freezeメーリングリストで言及されました

私はすでにそれを調べましたが、いや、単純な再コンパイルではありません-または、すでに行われているでしょう! :-)

進行中であり、少し手間がかかるようです。パッケージ内の拡張モジュールのようなものを処理するために配置されているコードの一部は転倒しています-そして、それはそのコードをドロップし、Zipファイル(吸収される必要がある別のプル要求)の外にパッケージを強制することによってよりよく解決されるかもしれません。これをさらに調査するために、来週と次の週に時間が必要です。すべてがうまく機能しているので、年末までにcx_Freezeの新しいバージョンをリリースする必要があります。

しかし、おそらくあなたはもっと幸運を持っています... バグレポートはこちら

69
Martin Tournoij

C:\\LOCAL_TO_PYTHON\\...などのインストール固有の絶対パスを使用して環境変数を設定する代わりに、osなどのPython標準パッケージの__file__属性を使用して必要なパスを動的に導出することもできます。

import os.path
PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6')
os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6')

この修正後、実行可能ファイルは作成されますが、実行しようとすると「DLL not foundエラー」が表示される可能性があります-少なくともWindows 10上のPython 3.5.3およびcx_Freeze 5.0.1で。

次のオプションを追加すると、必要なDLLファイルがPython-Installationディレクトリからcx-Freezeのビルド出力に自動的にコピーされ、Tcl/Tkアプリケーションを実行できるようになります。

options = {
    'build_exe': {
        'include_files':[
            os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'),
            os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'),
         ],
    },
}

# ...

setup(options = options,
      # ...
)
35
D. L. Müller

Setup.pyでセットアップする前にこれを置くだけです

import os

os.environ['TCL_LIBRARY'] = "C:\\LOCAL_TO_PYTHON\\Python35-32\\tcl\\tcl8.6"
os.environ['TK_LIBRARY'] = "C:\\LOCAL_TO_PYTHON\\Python35-32\\tcl\\tk8.6"

そしてそれを実行します:

python setup.py bdist_msi

これは私にとってはうまくいきました。

14
Guilherme

python 3.6で次のエラーが発生する場合:

copying C:\LOCAL_TO_PYTHON\Python35-32\tcl\tcl8.6 -> build\exe.win-AMD64-3.6\tcl
error: [Errno 2] No such file or directory: 'C:\\LOCAL_TO_PYTHON\\Python35-32\\tcl\\tcl8.6'

LOCAL_TO_PYTHONC:\ dirを作成し、その中にPython35-32 dirを作成するだけです。 tcl dirを既存のPython36 dir(C:\内)からPython35-32にコピーします。

その後、正常に動作します。

5
Ben Wills

D。L.Müllerの回答 cx_Freezeバージョン5.1.1または5.1.0に変更する必要があります。これらのバージョンのcx_Freezeでは、パッケージはビルドディレクトリのサブディレクトリlibに凍結されます。 TCLおよびTK DLLもそこに移動する必要があります。これは、タプル(source, destination)include_filesリストオプションの対応するエントリに渡すことで実現できます( cx_Freeze documentation を参照)。

setup.pyスクリプト全体を次のように変更する必要があります。

import os.path
PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6')
os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6')

# ...

options = {
    'build_exe': {
        'include_files':[
            (os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'), os.path.join('lib', 'tk86t.dll'))
            (os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'), os.path.join('lib', 'tcl86t.dll'))
         ],
    },
}

# ...

setup(options = options,
      # ...
)
0
jpeg

python 3.6で次のエラーが発生する場合:

C:\LOCAL_TO_PYTHON\Python35-32\tcl\tcl8.6-> build\exe.win-AMD64-3.6\tclエラーのコピー:[Errno 2] No such file or directory: 'C:\\LOCAL_TO_PYTHON\\Python35-32\\tcl\\tcl8.6'

C:\にLOCAL_TO_PYTHON dirを作成し、その中にPython35-32 dirを作成します。次に、tcl dirを既存のPython36 dir(C :)からPython35-32にコピーします。

その後、正常に動作します。

**この手順を実行し、ビルドディレクトリに.exeファイルを作成しましたが、アプリをクリックしようとすると、画面上ですぐに待機しないでください、ここに私のコード**

from tkinter import *
import socket



window=Tk()
window.geometry("400x150")
window.title("IpConfiger")
window.config(background="black")

def goster():
    x=socket.gethostbyname(socket.gethostname())
    label=Label(window,text=x,fg="green",font=("Helvetica",16))
    label.pack()
def information():
    info=Label(window,text="Bu program anlık ip değerini 
    bastırır.",fg="green",font=("Helvetica",16),bg="black")
    info.pack()


information()
tikla=Button(window,text="ip göster",command=goster)

tikla.pack()
0
Onur Çakır