繁体   English   中英

从Python将值传递给KSH脚本

[英]Passing values to KSH scripts from Python

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

这个脚本要求用户在某些点输入文本-我想KSH中与Python的input()等价的东西都是如此。

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

我对于以这种方式在外壳上使用Python还是很陌生,所以如果这个问题没有道理,我深表歉意。 很高兴收到任何反馈。 我以前没有问过这个问题-大多数人都询问将参数传递给脚本的情况-但由于找不到关键搜索词,我可能错过了一些东西。

Python版本是2.7,它是UNIX环境。

  1. 您可以将参数保存在Python中,并在每次调用脚本时在命令行上提供它们。

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

read在任何POSIX兼容外壳程序(包括ksh input()中等同于Python的input()


因此,在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字符串不会被解释为仅包含一个换行符,并且避免了自动剥离末尾的空白交易的外壳结束。


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

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都不能在不使用非常不愉快的技巧的情况下从字面上处理所有这些值)。


就是说,通常最好的做法是在命令行上或通过环境传递参数,而不是按照您的建议从stdin读取。 从而:

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

...仅当尚未提供其他值(例如通过环境)时,才会从stdin的arg1读取一个值。 这样一来,您的脚本仍然可以像以前一样交互式地通过命令行提示用户,但是还提供了一种直接从环境读取内容的替代行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM