【问题标题】:How to return a value from Python script as a Bash variable?如何从 Python 脚本返回一个值作为 Bash 变量?
【发布时间】:2013-11-17 13:56:16
【问题描述】:

这是我的代码摘要:

# import whatever

def createFolder():
    #someCode
    var1=Gdrive.createFolder(name)
    return var1 

def main():
    #someCode
    var2=createFolder()
    return var2

if __name__ == "__main__":
    print main()

我设法将值返回给 bash 变量的一种方法是打印从 main() 返回的内容。另一种方法是在脚本的任何位置打印变量

有没有办法以更pythonic的方式返回它?

脚本是这样调用的:

folder=$(python create_folder.py "string_as_arg")

【问题讨论】:

    标签: python bash return-value main


    【解决方案1】:

    一个更 pythonic 的方法是避免使用 bash 并在 python 中编写全部内容。

    你不能指望bash 有一种从另一个进程获取值的pythonic 方式——它的方式就是bash 方式。

    bash 和 python 运行在不同的进程中,进程间通信(IPC)必须通过内核。有许多 IPC 机制,但 bash 并不都支持它们(例如共享内存)。这里最小的公分母是 bash,所以你必须使用 bash 支持的,而不是 python 有的(python 拥有一切)。

    没有共享内存,写入另一个进程的变量不是一件简单的事情——更不用说另一种语言了。调试器会这样做,但它们是专门为宿主语言编写的。

    你从bash中使用的机制是捕获子进程的stdout,所以python必须print。在幕后,这使用了一个匿名管道。您可以改用命名管道(也称为 fifo),python 会以普通文件的形式打开该管道并将 write 打开。但它不会让你买太多。

    【讨论】:

    • 可能是我自己没有解释清楚,这可能是由于我缺乏英语。我想问的是一种将python脚本中生成的值返回给bash变量的方法。 main 函数返回了一个值,但我不知道如何从 main() 调用中最终返回它。
    • 这就是我以为你的意思。限制在于将 Bash 与 Python 混合使用。为什么不在 Python 脚本中编写 Bash 部分? Bash 不能做任何你在 Python 中做不到的事情。
    • 是的,说实话,我更熟悉 bash 来做一些 unix 基本的东西,比如目录 grep 中的列表文件,剪切......我害怕在 python 中做这些基本的东西并被更差。你有什么看法?
    • 我的意见是你应该继续学习python——它甚至可以让你的bash代码变得更好。我们都是从某个地方开始的,你不能指望一夜之间成为专家。编程任何语言都需要努力和练习——不要放弃。
    【解决方案2】:

    如果您在 bash 中工作,那么您可以这样做:

    export var="value"
    

    但是,Python 中没有这样的等价物。如果您尝试使用os.environ,这些值将在该过程的其余部分持续存在,并且在程序完成后不会修改任何内容。最好的办法是完全按照您已经在做的事情去做。

    【讨论】:

    • 可能正如您所说,最好的方法是在代码的任何位置打印 main() 或打印变量,但是我仍然印象深刻的是没有“默认”或“预定义”的方式退货。
    【解决方案3】:

    您可以尝试在 python 代码中设置一个环境变量,然后在外部的 bash 脚本中读取它。这种方式对我来说看起来很优雅,但它绝对不是“完美的解决方案”或唯一的解决方案。如果你喜欢这种方法,这个帖子可能有用:How to set environment variables in Python

    还有其他方法,与您所做的非常相似。还要检查这个线程:store return value of a Python script in a bash script

    【讨论】:

    • 这并不像你认为的那样。运行这个:gist.github.com/sigmavirus24/7514037,然后在你的终端执行“echo $TEST_VARIABLE”。它们不会在当前进程(或子进程)之外持续存在。
    【解决方案4】:

    只需使用sys.exit(),即:

    import sys
    
    [...]
    
    if __name__ == "__main__":
        sys.exit(main())
    

    【讨论】:

    • 如果他想返回一个字符串怎么办
    • 哦,是的,对。在 unix 中“返回”字符串不是很习惯 - 只需打印您对 stdout 的输入所做的转换结果,并返回退出代码以告诉调用者您的脚本是否成功(可选地在 stderr 上提供一些错误消息如果失败)。
    • 这个解决方案对我不起作用,如前所述,我正在返回一个字符串。
    猜你喜欢
    • 2018-06-25
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多