执行子进程:将 PYTHONPATH 传递给子进程
Exec a subprocess : pass PYTHONPATH to the subprocess
当我执行 Python 脚本并确保正确设置 PYTHONPATH 以引用依赖模块时。在 Python 代码中,我调用了一个 TCL 脚本,它又调用了一个 Python 脚本,如下所示:
if {[catch {exec {*}[auto_execok python] [file nativename [file join [file dirname [info script]] my.py ]] } result] == 0 } {
puts "Executed successfully $result"
} else {
puts "Error $result"
return error
}
我能够成功地在外部执行 Python 脚本 my.py 但是当从 TCL 脚本执行时它会出现问题。不知何故,我发现这是因为在调用 Python 脚本时 PYTHONPATH 没有被正确传递,因为 my.py 指的是 depdency Python 模块。
如何在 exec 命令中传递 PYTHONPATH?
PYTHONPATH
是一个环境变量。它们通过 env
全局变量进行操作:
# You might be able to set this once for your whole script
set python_path {C:/Python/3.6/wherever C:/Users/me/Python/3.6/wherever}
# Transform a Tcl list into the right format that Python expects
set ::env(PYTHONPATH) [join [lmap p $python_path {file nativename $p}] \
$::tcl_platform(pathSeparator)]
# Split this out for a shorter line length. ;-)
set my_py [file join [file dirname [info script]] my.py]
if {[catch {exec {*}[auto_execok python] [file nativename $my_py]} result] == 0 } {
puts "Executed successfully $result"
} else {
puts "Error $result"
return error
}
在 Tcl 8.5 中,您没有 lmap
或 tcl_platform
的 pathSeparator
元素,而是会执行如下操作:
foreach p $python_path {
if {[info exist ::env(PYTHONPATH)]} {
# Assume Windows
append ::env(PYTHONPATH) ";" [file nativename $p]
} else {
set ::env(PYTHONPATH) [file nativename $p]
}
}
如果值只是一个或两个元素,您也可以对其进行硬编码。请记住,反斜杠 (\
) 对 Tcl 很重要,因此如果您这样做,请将字符串放在 {
…}
中。
set ::env(PYTHONPATH) {C:\Python.6\wherever;C:\Users\me\Python.6\wherever}
这对于任何可再分发的东西都不是特别可行……但适用于自己的脚本。
当我执行 Python 脚本并确保正确设置 PYTHONPATH 以引用依赖模块时。在 Python 代码中,我调用了一个 TCL 脚本,它又调用了一个 Python 脚本,如下所示:
if {[catch {exec {*}[auto_execok python] [file nativename [file join [file dirname [info script]] my.py ]] } result] == 0 } {
puts "Executed successfully $result"
} else {
puts "Error $result"
return error
}
我能够成功地在外部执行 Python 脚本 my.py 但是当从 TCL 脚本执行时它会出现问题。不知何故,我发现这是因为在调用 Python 脚本时 PYTHONPATH 没有被正确传递,因为 my.py 指的是 depdency Python 模块。
如何在 exec 命令中传递 PYTHONPATH?
PYTHONPATH
是一个环境变量。它们通过 env
全局变量进行操作:
# You might be able to set this once for your whole script
set python_path {C:/Python/3.6/wherever C:/Users/me/Python/3.6/wherever}
# Transform a Tcl list into the right format that Python expects
set ::env(PYTHONPATH) [join [lmap p $python_path {file nativename $p}] \
$::tcl_platform(pathSeparator)]
# Split this out for a shorter line length. ;-)
set my_py [file join [file dirname [info script]] my.py]
if {[catch {exec {*}[auto_execok python] [file nativename $my_py]} result] == 0 } {
puts "Executed successfully $result"
} else {
puts "Error $result"
return error
}
在 Tcl 8.5 中,您没有 lmap
或 tcl_platform
的 pathSeparator
元素,而是会执行如下操作:
foreach p $python_path {
if {[info exist ::env(PYTHONPATH)]} {
# Assume Windows
append ::env(PYTHONPATH) ";" [file nativename $p]
} else {
set ::env(PYTHONPATH) [file nativename $p]
}
}
如果值只是一个或两个元素,您也可以对其进行硬编码。请记住,反斜杠 (\
) 对 Tcl 很重要,因此如果您这样做,请将字符串放在 {
…}
中。
set ::env(PYTHONPATH) {C:\Python.6\wherever;C:\Users\me\Python.6\wherever}
这对于任何可再分发的东西都不是特别可行……但适用于自己的脚本。