【问题标题】:Exec a subprocess : pass PYTHONPATH to the subprocess执行子进程:将 PYTHONPATH 传递给子进程
【发布时间】:2019-12-26 16:14:56
【问题描述】:

当我执行 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 引用了依赖 Python 模块。

如何在 exec 命令中传递 PYTHONPATH?

【问题讨论】:

    标签: tcl


    【解决方案1】:

    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\3.6\wherever;C:\Users\me\Python\3.6\wherever}
    

    这对于任何可再分发的东西都不是特别可行……但适用于自己的脚本。

    【讨论】:

    • 似乎 lmap 在 TCL 8.5 中不可用 - 尽管有一个问题我们可以通过 PYTHON 路径,如 [auto_execok python --pythonpath $systempypath] ...
    • 不在auto_execok 调用中。
    猜你喜欢
    • 2014-06-22
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 2018-09-17
    相关资源
    最近更新 更多