我在 tkinter 中制作了一个应用程序,它有助于创建 tkinter 应用程序/脚本,(当我导出文件时,它存储为 .py)
我想从我的应用程序运行这个 .py 脚本,以便我们可以在导出后立即预览它。
我使用了
subprocess.run
方法,它在 python 应用程序中完美运行。
但是当我使用 pyinstaller 将应用程序转换为 exe 时,由于 tcl 版本错误,预览功能不起作用。
init.tcl: version conflict for package "Tcl": have 8.6.10, need exactly 8.6.9
version conflict for package "Tcl": have 8.6.10, need exactly 8.6.9
while executing
"package require -exact Tcl 8.6.9"
(file "C:----/_MEI170162/tcl/init.tcl" line 19)
invoked from within
"source {C:-----/_MEI170162/tcl/init.tcl}"
("uplevel" body line 1)
invoked from within
"uplevel #0 [list source $tclfile]"
This probably means that Tcl wasn't installed properly.
我尝试了
subprocess.run
、subprocess.startfile
、os.system
,甚至 webbroswer.open
方法来运行导出的 .py tkinter 应用程序,但显示了相同的错误。请注意,我使用旧版本的 python 编译了该应用程序,因此 tcl 版本也不同。在我的主系统中,python 版本设置为最新版本,因此子进程正在使用该 tcl 版本,但我不想与主应用程序的 tcl/python 版本有任何连接。
由于用户可能安装了不同版本的python,因此也会有不同的tcl版本,这种情况下会再次显示此错误。
我尝试了
exec(open(file).read())
方法,虽然它有效,但某些导出存在问题,例如pyimages丢失错误。
还有其他方法可以运行更独立的Python脚本吗?
终于得到答案了,我们可以在运行子进程之前删除tcl环境变量
import os
import subprocess
file_path = "C:/----/test/py"
def run_script():
env = os.environ.copy()
if 'TCL_LIBRARY' in env:
del env['TCL_LIBRARY']
if 'TK_LIBRARY' in env:
del env['TK_LIBRARY']
sp = subprocess.run(["python",file_path], shell=True, env=env)