您好我正在尝试使用以下命令从python执行shell脚本。
os.system("sh myscript.sh")
在我的shell脚本中我写了一些SOP,现在如何在我的Python中获取SOP以便我可以将它们记录到某个文件中?
我知道使用subprocess.Popen
我可以这样做,因为某些原因我无法使用它。
p=subprocess.Popen(
'DMEARAntRunner \"'+mount_path+'\"',
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT
)
while 1:
line=p.stdout.readline()[:-1]
if not line:
break
write_to_log('INFO',line)
p.communicate()
答案 0 :(得分:1)
我个人建议您将shell
参数保留为默认值False
。在这种情况下,第一个参数不是你输入终端的字符串,而是一个“单词”列表,第一个是程序,后面是参数。这意味着不需要引用参数,使您的程序更容易适应空白参数和injection attacks。
这应该可以解决问题:
p = subsprocess.Popen(['DMEARAntRunner', mount_path],
stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
与执行shell命令一样,问题仍然是它是否是解决问题的最简单/最好的方法,但这是另一个完全的讨论。
答案 1 :(得分:1)
请检查使用python中的子进程模块的official documentation。目前,这是os.system调用执行系统函数和检索结果的推荐方法。上面的链接提供了非常接近您需要的示例。
答案 2 :(得分:1)
如果我理解你的问题,你需要这样的东西:
import subprocess
find_txt_command = ['find', '-maxdepth', '2', '-name', '*.txt']
with open('mylog.log', 'w') as logfile:
subprocess.call(find_txt_command, stdout=logfile, shell=False)
如果需要,可以使用Popen代替调用,语法非常相似。请注意,命令是包含要运行的进程和参数的列表。一般来说,你想使用shell = False的Popen / call,它可以防止难以调试的意外行为,并且它更具可移植性。