如何从冻结的Python代码运行批处理文件

问题描述 投票:0回答:1

我有两个Python脚本,第一个脚本询问用户拥有的商业工具的版本(以及相应的Python版本)。 基于此,该脚本运行一个批处理文件,以使用用户选择的不同 Python 版本运行第二个脚本。 第一个脚本中的代码包括:

p = subprocess.Popen(args=batch_loc, shell=False, creationflags=subprocess.CREATE_NEW_CONSOLE)

其中batch_loc是批处理文件的位置(在补丁文件内:

py -3.7-32 C:\code\source\NB_converter_gui.py
其中3.7-32是用户选择的Python版本)

代码运行没有任何问题。

但是,当我使用 cx_freeze 打包代码时,运行批处理文件中的第二个代码会尝试使用冻结库中的库,而不是用户端的 Python 版本。 错误代码如下。

我的问题是,如何从冻结的Python代码运行批处理文件(Python脚本)并在用户端使用Python版本?

这是错误:

C:\>py -3.7-32 C:\code\source\NB_converter_gui.py psse34
Traceback (most recent call last):
  File "C:\code\base_none\source\NB_converter_gui.py", line 480, in <module>
    main(psse)
  File "C:\code\base_none\source\NB_converter_gui.py", line 473, in main
    root = tk.Tk()
  File "C:\Python37\lib\tkinter\__init__.py", line 2023, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: Can't find a usable init.tcl in the following directories:
    {C:\code\base_none\lib\tcl8.6} C:/Python37/lib/tcl8.6 C:/lib/tcl8.6 C:/lib/tcl8.6 C:/library C:/library C:/tcl8.6.9/library C:/tcl8.6.9/library

C:/code/base_none/lib/tcl8.6/init.tcl: version conflict for package "Tcl": have 8.6.9, need exactly 8.6.12
version conflict for package "Tcl": have 8.6.9, need exactly 8.6.12
    while executing
"package require -exact Tcl 8.6.12"
    (file "C:/code/base_none/lib/tcl8.6/init.tcl" line 19)
    invoked from within
"source C:/code/base_none/lib/tcl8.6/init.tcl"
    ("uplevel" body line 1)
    invoked from within
"uplevel #0 [list source $tclfile]"


This probably means that Tcl wasn't installed properly.
batch-file subprocess popen cx-freeze
1个回答
0
投票

感谢@Mofi,问题出在 PYTHONPATH 上。 当在第一个代码中调用子流程时,第一个代码的环境变量(父级)默认传递给第二个代码(子级)。所以解决办法就是传递路径中没有第一个代码python目录的PYTHONPATH的系统环境

env = os.environ
if env.get('PYTHONPATH'):
    del env['PYTHONPATH']
if os.environ.get('TCL_LIBRARY'):   
    del os.environ['TCL_LIBRARY']
if os.environ.get('TK_LIBRARY'):
    del os.environ['TK_LIBRARY']
if os.environ.get('PYTZ_TZDATADIR'):
    del os.environ['PYTZ_TZDATADIR']


p = subprocess.Popen(args=file_loc, shell=False, creationflags=subprocess.CREATE_NEW_CONSOLE, env=env)

第二个代码将在不继承第一个代码中的 PYTHONPATH 或其他变量的情况下运行。

© www.soinside.com 2019 - 2024. All rights reserved.