将值传递给Python的KSH脚本

时间:2015-01-27 14:22:03

标签: python shell input ksh

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

此脚本要求用户在某些点输入文本 - 无论Python的输入()是否与KSH相同,我猜。

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

我以这种方式在shell上使用Python很新,所以如果这个问题没有意义,那么道歉。很高兴收到任何反馈。我以前没有发现过这个问题 - 大多数人都会问过将参数传递给剧本 - 但我可能因为找不到关键搜索词而错过了一些东西。

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

与任何符合POSIX标准的shell中的Python input()相当,包括ksh,read


因此,在Python方面:

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

......并且在shell方面:

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

清除IFS并传递-r会使解释更加文字化,因此包含Python端的两个字符\n的字符串不会被解释为包含只有一个换行符,并且避免在事务的shell端自动剥离尾部空格。


如果您的字符串可以包含换行符等,那么您将要使用尾随的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的值(通过环境)。这使得您的脚本仍然可以交互使用,提示用户通过命令行,但也提供了直接从环境中读取内容的替代行为。

相关问题