我使用Python运行.ksh脚本,使用subprocess.call()。
此脚本要求用户在某些点输入文本 - 无论Python的输入()是否与KSH相同,我猜。
我遇到的问题是我必须运行脚本大约200次,而且我不想每次都输入这些信息。无论如何,我可以设置它,以便这些用户输入请求每次都自动赋予一些值,而用户甚至不需要做任何事情吗?
我以这种方式在shell上使用Python很新,所以如果这个问题没有意义,那么道歉。很高兴收到任何反馈。我以前没有发现过这个问题 - 大多数人都会问过将参数传递给剧本 - 但我可能因为找不到关键搜索词而错过了一些东西。
Python版本是2.7,它是一个UNIX环境。
答案 0 :(得分:0)
您可以在Python中保存参数,并在每次调用脚本时在命令行上提供它们。
您的脚本可以将它们存储在文件(或数据库,服务......)中,并在重新启动时读取它们。
答案 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)
...其中arg1
和arg2
是您希望传递的内容的变量,然后在脚本中可以称为$1
和$2
。或者,变量可以通过环境传递:
subprocess.Popen(['yourscript'], shell=False, env={
'arg1': arg1,
'arg2': arg2,
})
...在这种情况下,ksh脚本可以直接引用"$arg1"
和"$arg2"
作为值。
考虑查找当前运行脚本的位置:
read arg1
并将其替换为
[[ $arg1 ]] || read arg1
...只有在没有提供其他值的情况下才会从stdin中读取arg1
的值(通过环境)。这使得您的脚本仍然可以交互使用,提示用户通过命令行,但也提供了直接从环境中读取内容的替代行为。