从pythonshell运行bash命令
我想从pythonshell运行bash命令。 我的聚会是:从pythonshell运行bash命令,python,bash,Python,Bash,我想从pythonshell运行bash命令。 我的聚会是: grep -Po "(?<=<cite>).*?(?=</cite>)" /tmp/file1.txt | awk -F/ '{print $1}' | awk '!x[$0]++' > /tmp/file2.txt grep-Po”(?命令模块现在已经过时。 如果您实际上不需要命令的输出,可以使用 import os exit_status = os.system("your-command"
grep -Po "(?<=<cite>).*?(?=</cite>)" /tmp/file1.txt | awk -F/ '{print $1}' | awk '!x[$0]++' > /tmp/file2.txt
grep-Po”(?命令模块现在已经过时。
如果您实际上不需要命令的输出,可以使用
import os
exit_status = os.system("your-command")
import suproccess
out, err = subprocess.Popen("your | commands", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell = True).communicate()
否则,您可以使用
import os
exit_status = os.system("your-command")
import suproccess
out, err = subprocess.Popen("your | commands", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell = True).communicate()
注意:对于您的命令,您将stdout发送到file2.txt
,因此我不希望在out
中看到任何内容,但是您仍然会在stderr上看到错误消息,这些消息将进入err
模块命令现在已过时。
如果您实际上不需要命令的输出,可以使用
import os
exit_status = os.system("your-command")
import suproccess
out, err = subprocess.Popen("your | commands", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell = True).communicate()
否则,您可以使用
import os
exit_status = os.system("your-command")
import suproccess
out, err = subprocess.Popen("your | commands", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell = True).communicate()
注意:对于您的命令,您将stdout发送到file2.txt
,因此我不希望在out
中看到任何内容,但是您仍然会在stderr上看到错误消息,这些消息将进入err
,建议在python中运行系统命令的方法是使用该模块
导入子流程
a=['grep','-Po','”(?建议在python中运行系统命令的方法是使用模块
导入子流程
a=['grep','-Po','”(?如果要避免分割参数和担心管道,可以使用shell=True
选项:
cmd = "grep -Po \"(?<=<dev>).*?(?=</dev>)\" /tmp/file.txt | awk -F/ '{print $1}' | awk '!x[$0]++' > file2.txt"
out = subprocess.check_output(cmd, shell=True)
cmd=“grep-Po\”(?如果希望避免分割参数和担心管道,可以使用shell=True
选项:
cmd = "grep -Po \"(?<=<dev>).*?(?=</dev>)\" /tmp/file.txt | awk -F/ '{print $1}' | awk '!x[$0]++' > file2.txt"
out = subprocess.check_output(cmd, shell=True)
cmd=“grep-Po\”(?您必须使用
import os
os.system(command)
你必须使用
import os
os.system(command)
让我们编写一个简单的函数来轻松处理这些杂乱的管道:
def subprocess_pipes (pipes, last_pipe_out = None):
import subprocess
from subprocess import PIPE
last_p = None
for cmd in pipes:
out_pipe = PIPE if not (cmd==pipes[-1] and last_pipe_out) else open(last_pipe_out, "w")
cmd = cmd if isinstance(cmd, list) else cmd.split(" ")
in_pipe = last_p.stdout if last_p else None
p = subprocess.Popen(cmd, stdout = out_pipe, stdin = in_pipe)
last_p = p
comm = last_p.communicate()
return comm
然后我们跑
subprocess_pipes(("ps ax", "grep python"), last_pipe_out = "test.out.2")
结果是一个“test.out.2”文件,其内容是将“ps ax”管道化为“grep python”
就你而言
a = ["grep", "-Po", "(?<=<cite>).*?(?=</cite>)", "/tmp/file1.txt"]
b = ["awk", "-F/", "{print $1}"]
c = ["awk", "!x[$0]++"]
subprocess_pipes((a, b, c), last_pipe_out = "/tmp/file2.txt")
a=[“grep”、“-Po”、”(?让我们编写一个简单的函数来轻松处理这些混乱的管道:
def subprocess_pipes (pipes, last_pipe_out = None):
import subprocess
from subprocess import PIPE
last_p = None
for cmd in pipes:
out_pipe = PIPE if not (cmd==pipes[-1] and last_pipe_out) else open(last_pipe_out, "w")
cmd = cmd if isinstance(cmd, list) else cmd.split(" ")
in_pipe = last_p.stdout if last_p else None
p = subprocess.Popen(cmd, stdout = out_pipe, stdin = in_pipe)
last_p = p
comm = last_p.communicate()
return comm
然后我们跑
subprocess_pipes(("ps ax", "grep python"), last_pipe_out = "test.out.2")
结果是一个“test.out.2”文件,其内容是将“ps ax”管道化为“grep python”
就你而言
a = ["grep", "-Po", "(?<=<cite>).*?(?=</cite>)", "/tmp/file1.txt"]
b = ["awk", "-F/", "{print $1}"]
c = ["awk", "!x[$0]++"]
subprocess_pipes((a, b, c), last_pipe_out = "/tmp/file2.txt")
a=[“grep”、“-Po”、”(?我想你要找的是:
ubprocess。检查输出(与popen参数相同,**kwargs)
,使用方法与使用popen
命令相同,它应该显示正在调用的程序的输出
有关更多详细信息,请访问以下链接:我认为您需要的是:
ubprocess。检查输出(与popen参数相同,**kwargs)
,使用方法与使用popen
命令相同,它应该显示正在调用的程序的输出
有关更多详细信息,这里有一个链接:命令
被弃用,取而代之的是子流程
。也就是说,您在这里所做的操作——调用shell,而不是自己在Python中进行处理或设置管道——无论如何都被认为是糟糕的做法(如果处理用户提供的数据时不小心,可能会导致shell注入攻击).命令
被弃用,取而代之的是子流程
。也就是说,您在这里所做的事情——调用shell,而不是自己在Python中进行处理或设置管道——无论如何都被认为是糟糕的做法(而且,如果不非常小心,如果处理用户提供的数据,可能会导致shell注入攻击)。在我的情况下,您使用导入操作系统的答案更好,因为我正在将输出写入一个文件。此答案不会按照OP的需要将输出写入file2.txt。事实上,它甚至不会正确创建管道。后者是“awk”命令及其所有参数都将作为参数传递给“grep”(这会让人非常困惑)。请参阅我的答案,以了解如何正确地通过管道传输各种命令,以及如何使用子进程写入文件。@erjoalgo已编辑。现在似乎对我有效。但您和bort的答案更好。在我的情况下,您使用导入操作系统的答案更好,因为我正在将输出写入文件。此答案不会按照OP的需要将输出写入file2.txt。I事实上,它甚至不能正确地创建管道。后一个“awk”命令及其所有参数都将作为参数传递给“grep”(这会让人非常困惑)。请参阅我的答案,以了解如何使用子进程正确地传递各种命令和写入文件的示例。@erjoalgo Edited。现在似乎对我有效。。但您和bort的答案更好。由于shell=True
,命令将在子shell中运行,因此所有shell指令,包括“>”若要将标准输出重定向到文件,应按预期工作。您是说,file2.txt
未被创建?不…它正在工作…但有一个问题..我有sed
命令…我可以更新我的问题,然后您可以帮助吗?谢谢。尽管您应该了解模式,以便您可以自己执行这些管道。@nettux443而不是手动创建这些繁琐的管道,我们可以编写一个函数来处理它们。请参阅我的最新答案,让我知道它是如何工作的。由于shell=True
,该命令将在子shell中运行,因此所有shell指令,包括“>”若要将标准输出重定向到文件,应按预期工作。您是说,file2.txt
未被创建?不…它正在工作…但有一个问题..我有sed
命令…我可以更新我的问题,然后您可以帮助吗?谢谢。尽管您应该了解模式,以便您可以自己执行这些管道。@nettux443而不是手动创建这些繁琐的管道,我们可以编写一个函数来处理它们。请参阅我的最新答案,让我知道它是如何工作的。很好!我唯一的优势就是使用string.split()
--人们很容易通过字符串替换来传递文件名。最好鼓励首先以数组形式传递参数。不过,这是一段非常可爱的代码;+1.Nice!我唯一的优势就是使用了string.split()
--人们很容易尝试通过字符串替换来传递文件名。最好鼓励以数组的形式传递参数。尽管如此