Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 子流程-使用多个命令行工具_Python_Command Line_Subprocess_Pipe_Os.system - Fatal编程技术网

Python 子流程-使用多个命令行工具

Python 子流程-使用多个命令行工具,python,command-line,subprocess,pipe,os.system,Python,Command Line,Subprocess,Pipe,Os.system,我是一个学习python和在命令行工作的新手,例如管道 我读到过这样一篇文章:鼓励使用子流程,而不是os.system。我正在创建一个调用shell的脚本,但我无法使用subprocess来完成。不过,使用os.system很简单: os.system("cut -f1-4 " + temp1.name + "| uniq --count | sort -rn > " + temp2.name) 我已经成功地将subprocess用于其他命令,但没有将多个工具与|结合使用的命令。阅读子流

我是一个学习python和在命令行工作的新手,例如管道

我读到过这样一篇文章:鼓励使用子流程,而不是os.system。我正在创建一个调用shell的脚本,但我无法使用subprocess来完成。不过,使用os.system很简单:

os.system("cut -f1-4 " + temp1.name + "| uniq --count | sort -rn > " + temp2.name)
我已经成功地将subprocess用于其他命令,但没有将多个工具与|结合使用的命令。阅读子流程python文档令人困惑,对我没有帮助。我也尝试过搜索其他问题,但找不到与我的问题类似的问题。这就是我尝试过但失败的地方:

subprocess.call = (["cut", "-f1-4", temp1.name, "|",  "uniq", "--count", "|", "sort". "-rn"], stdout = open(temp2.name, 'w'))
我还尝试用sp.Popen替换sp.call,但失败了。有人能帮我举一些清楚的例子和解释吗?
谢谢

如果要使用管道,应添加shell=True


请注意,如果temp1.name或temp2.name来自不受信任的来源,例如来自web应用程序中用户使用shell=True提供的数据,则存在安全风险。

如果要使用管道,则应添加shell=True


请注意,如果temp1.name或temp2.name来自不受信任的源,例如来自用户在web应用程序中使用shell=True提供的数据,这将是一种安全风险。

值得一看这个伟大的库,它是一个完整的Python子进程接口,允许您像调用函数一样调用任何程序,更重要的是,它是令人愉快的蟒蛇式的

在这种情况下,为了满足您的特殊需要,它提供了一些“高级管道”功能,如下所示:

# the inner command executes first, then sends its data to the outer command
from sh import *
sort(uniq(cut("-f1-4", _in="temp1.name"), "--count"), "-rn", _out="temp2.name")

值得一看这个伟大的库,它是一个完整的Python子进程接口,允许您像调用函数一样调用任何程序,更重要的是,它是一个令人愉快的Python接口

在这种情况下,为了满足您的特殊需要,它提供了一些“高级管道”功能,如下所示:

# the inner command executes first, then sends its data to the outer command
from sh import *
sort(uniq(cut("-f1-4", _in="temp1.name"), "--count"), "-rn", _out="temp2.name")

subprocess.call=…–您刚刚用元组替换了一个库函数。你为什么认为这会起作用?你需要调用函数…对不起,我不知道你的意思。你能进一步解释一下吗?我通过调用列表中的项成功地使用了subprocess.call,例如subprocess.call[program,inputfile,outputfile]subprocess.call=…–您刚刚用元组替换了一个库函数。你为什么认为这会起作用?你需要调用函数…对不起,我不知道你的意思。你能进一步解释一下吗?我通过调用列表中的项目成功地使用了subprocess.call,例如subprocess.call[program,inputfile,outputfile]谢谢@hans!成功了!!但我不清楚为什么要使用sp.check_输出,因为我想读取输出,而不仅仅是检查命令是否有效?这令人困惑。无论如何,安全风险最小,因为temp1.name和temp2.name文件是由脚本根据特定的用户输入生成的。很抱歉,让您更加困惑。如果只想检查返回值,可以简单地使用call。是习惯的力量让我输入check_output.Hm,我发誓我以前试过,但它对sp.call不起作用。这就是为什么我将整行内容分成一个列表,因为根据我的理解,sp.call会接受这个列表。无论如何,再次感谢!也许您第一次没有指定shell=True?我尝试了太多东西,记不起来了。我想我试过了,但我将命令分解成了列表项,例如,当我读到sp.call在列表中获取了项,我就是这样使用sp.call的。然后我添加了shell=True,但它不起作用。但再次感谢,今天我学到了一些新东西谢谢@hans!成功了!!但我不清楚为什么要使用sp.check_输出,因为我想读取输出,而不仅仅是检查命令是否有效?这令人困惑。无论如何,安全风险最小,因为temp1.name和temp2.name文件是由脚本根据特定的用户输入生成的。很抱歉,让您更加困惑。如果只想检查返回值,可以简单地使用call。是习惯的力量让我输入check_output.Hm,我发誓我以前试过,但它对sp.call不起作用。这就是为什么我将整行内容分成一个列表,因为根据我的理解,sp.call会接受这个列表。无论如何,再次感谢!也许您第一次没有指定shell=True?我尝试了太多东西,记不起来了。我想我试过了,但我将命令分解成了列表项,例如,当我读到sp.call在列表中获取了项,我就是这样使用sp.call的。然后我添加了shell=True,但它不起作用。但再次感谢,今天我学到了一些新东西谢谢@chuchao333,我来看看。谢谢@chuchao333,我来看看。