1

您好我正在尝试使用以下命令从 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()
4

3 回答 3

2

如果我正确理解你的问题,你想要这样的东西:

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 代替 call,语法非常相似。请注意,命令是一个包含您要运行的进程和参数的列表。通常,您希望使用带有 shell=False 的 Popen/call,它可以防止难以调试的意外行为,并且更便于移植。

于 2012-04-16T16:27:29.023 回答
2

请查看这个在 python 中使用 subprocess 模块的官方文档。目前推荐的方式是通过 os.system 调用来执行系统函数并检索结果。上面的链接提供了非常接近您需要的示例。

于 2012-04-16T16:21:11.443 回答
2

我个人建议您将shell参数保留为默认值False。在这种情况下,第一个参数不是您在终端中键入的字符串,而是一个“单词”列表,第一个是程序,之后是参数。这意味着不需要引用参数,使您的程序对空格参数和注入攻击更具弹性。

这应该可以解决问题:

p = subsprocess.Popen(['DMEARAntRunner', mount_path], 
    stdout=subprocess.PIPE,stderr=subprocess.STDOUT)

与执行 shell 命令一样,问题仍然是它是否是解决问题的最简单/最好的方法,但这完全是另一个讨论。

于 2012-04-16T16:08:26.387 回答