【问题标题】:Passing values to KSH scripts from Python从 Python 向 KSH 脚本传递值
【发布时间】:2015-01-27 14:22:02
【问题描述】:

我正在使用 Python 运行 .ksh 脚本,使用 subprocess.call()。

这个脚本要求用户在某些点输入文本——我猜在 KSH 中相当于 Python 的 input()。

我遇到的问题是我必须运行脚本约 200 次,而且我不想每次都输入这些信息。无论如何我可以设置它,以便每次用户输入的这些请求都会自动赋予一些价值,而用户甚至不需要做任何事情?

我对以这种方式在 shell 中使用 Python 很陌生,如果这个问题没有意义,我深表歉意。很高兴接受任何反馈。我之前没有发现这个问题——大多数人都在问关于向脚本传递参数的问题——但我可能错过了一些东西,因为我找不到关键的搜索词。

Python 版本是 2.7,是 UNIX 环境。

【问题讨论】:

  • 您需要将数据提供给stdin 上的脚本。 subprocess 模块可以让你做到这一点。
  • 可以修改脚本吗?写入其标准输入当然是可能,但更好的做法是更改其调用约定以允许通过标准输入以外的方式传入参数——环境变量、命令行参数等.

标签: python shell input ksh


【解决方案1】:
  1. 您可以将参数保存在 Python 中,并在每次调用脚本时在命令行中提供它们。

  2. 您的脚本可以将它们存储在文件(或数据库、服务等)中,并在再次启动时读取它们。

【讨论】:

    【解决方案2】:

    在任何符合 POSIX 标准的 shell(包括 ksh)中,与 Python 的 input() 等效的是 read


    因此,在 Python 方面:

    p = subprocess.Popen(['yourscript'], stdin=subprocess.PIPE)
    p.communicate(arg1 + '\n' + arg2 + '\n')
    

    ...在外壳方面:

    IFS= read -r arg1
    IFS= read -r arg2
    

    清除IFS 并传递-r 使解释更接近字面意思,因此在Python 端包含两个字符\n 的字符串不会被解释为仅包含一个换行符,并避免在事务的 shell 端自动去除尾随空格。


    如果您的字符串可以包含换行符等,那么您需要从 Python 程序中使用尾随 NUL 字符发出它:

    p = subprocess.Popen(['yourscript'], stdin=subprocess.PIPE)
    p.communicate(arg1 + '\0' + arg2 + '\0')
    

    ...从 shell 端读取它:

    IFS= read -r -d '' arg1
    IFS= read -r -d '' arg2
    

    这比您要求的 input() 更强大,因为它可以处理任意 C 字符串。 (Python 的原生字符串是 Pascal 风格的,因此可以包含文字 NUL;ksh 和任何其他现有的 POSIX 风格的 shell 都不能在不使用非常不愉快的技巧的情况下处理这些字符串的所有值)。


    也就是说,在命令行或通过环境传递参数通常会更好,而不是按照您的建议从标准输入中读取。因此:

    subprocess.Popen(['yourscript', arg1, arg2], shell=False)
    

    ...其中arg1arg2 是您希望传递的内容的变量,然后可以在脚本中引用$1$2。或者,变量可以通过环境传递:

    subprocess.Popen(['yourscript'], shell=False, env={
      'arg1': arg1,
      'arg2': arg2,
    })
    

    ...在这种情况下,ksh 脚本可以直接引用 "$arg1""$arg2" 的值。


    考虑查找您的脚本当前运行的位置:

    read arg1
    

    并将其替换为

    [[ $arg1 ]] || read arg1
    

    ...只有在没有提供其他值的情况下(如通过环境),它才会从标准输入中读取来自arg1 的值。这使得您的脚本仍然像往常一样通过命令行提示用户以交互方式使用,但也提供了直接从环境中读取内容的替代行为。

    【讨论】:

      猜你喜欢
      • 2011-06-26
      • 2018-03-03
      • 2017-01-22
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 2011-07-26
      相关资源
      最近更新 更多