【问题标题】:How to execute an arbitrary shell script and pass multiple variables via Python?如何通过 Python 执行任意 shell 脚本并传递多个变量?
【发布时间】:2010-10-17 09:27:24
【问题描述】:

我正在用 Python 构建一个应用程序插件,它允许用户使用简单的脚本(在 Mac OS X 下工作)任意扩展应用程序。执行 Python 脚本很容易,但有些用户更喜欢 Ruby 等语言。

根据我的阅读,我可以使用subprocess 轻松执行 Ruby 脚本(或其他任意 shell 脚本)并使用管道捕获它们的输出;这不是问题,网上有很多例子。但是,我需要为脚本提供多个变量(比如一段文本以及一些关于脚本正在修改的文本的简单布尔信息),我无法找出最好的方法。

有没有人建议最好的方法来完成这个?我的目标是用最少的代码为脚本提供他们需要的信息,以便在脚本中访问该信息。

提前致谢!

【问题讨论】:

    标签: python ruby macos shell environment-variables


    【解决方案1】:

    http://docs.python.org/library/subprocess.html#using-the-subprocess-module

    args 应该是一个字符串,或者一个序列 程序参数。该程序为 执行通常是第一项 args 序列或字符串,如果 a 给出字符串,但可以显式 使用可执行参数设置。

    所以,你的电话可能是这样的

    p = subprocess.Popen( args=["script.sh", "-p", p_opt, "-v", v_opt, arg1, arg2] )
    

    您已将任意 Python 值放入 subprocess.Popen 的参数中。

    【讨论】:

    • 我自己发现了,但这对脚本来说似乎不是很友好,因为如果它需要数据,它必须通过命令行参数进行解析。不过,如果没有更好的选择,我会选择这个。谢谢!
    • 什么?这是什么意思? “因为它[脚本]然后必须通过命令行参数进行解析”这就是脚本所做的。请更新您的问题以说明您的顾虑或问题。
    • 我需要找到将变量从我的 Python 代码中获取到非 Python 脚本中的方法,该方法在非 Python 脚本中占用最少的代码。脚本将由其他人编写,要求越少,他们编写它们的可能性就越大。
    • 命令行界面非常笨拙。很抱歉它是这样定义的,但是命令行 shell 接口是由 POSIX 标准和 unix 定义的。无法更改。
    【解决方案2】:

    如果您要启动多个脚本并且需要将相同的信息传递给每个脚本,您可以考虑使用环境(警告,我不懂 Python,所以下面的代码很可能很烂):

    #!/usr/bin/python 
    
    import os
    
    try:
        #if environment is set
        if os.environ["child"] == "1":
            print os.environ["string"]
    except:
        #set environment
        os.environ["child"]  = "1"
        os.environ["string"] = "hello world"
    
        #run this program 5 times as a child process
        for n in range(1, 5):
            os.system(__file__)
    

    【讨论】:

      【解决方案3】:

      您可以采用的一种方法是使用 json 作为父脚本和子脚本之间的协议,因为 json 支持在许多语言中很容易获得,并且具有相当的表现力。您还可以使用管道将任意数量的数据发送到子进程,假设您的要求允许您从标准输入读取子脚本。例如,父母可以做类似的事情(显示 Python 2.6):

      #!/usr/bin/env python
      
      import json
      import subprocess
      
      data_for_child = {
          'text' : 'Twas brillig...',
          'flag1' : False,
          'flag2' : True
      }
      
      child = subprocess.Popen(["./childscript"], stdin=subprocess.PIPE)
      json.dump(data_for_child, child.stdin)
      

      这是一个子脚本的草图:

      #!/usr/bin/env python
      # Imagine this were written in a different language.
      
      import json
      import sys
      
      d = json.load(sys.stdin)
      print d
      

      在这个简单的例子中,输出是:

      $ ./foo12.py {u'text': u'Twas brillig...', u'flag2': True, u'flag1': False}

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        • 1970-01-01
        • 2023-03-11
        • 2022-10-24
        • 1970-01-01
        • 2018-01-06
        相关资源
        最近更新 更多