在python中使用命令行参数而不是shell

在python中使用命令行参数而不是shell,python,command-line-arguments,Python,Command Line Arguments,假设python脚本可以通过以下方式调用: python myscript.py ./mycommand > myoutput.txt 如何确保myscript.py在命令行参数列表中获取/mycommand>myoutput.txt,而不是将python myscript.py./mycommand的输出管道化到文件中 编辑 使用引号会带来额外的问题。考虑: import subprocess import sys argList = sys.argv[1].split() sub

假设python脚本可以通过以下方式调用:

python myscript.py ./mycommand > myoutput.txt
如何确保
myscript.py
在命令行参数列表中获取
/mycommand>myoutput.txt
,而不是将
python myscript.py./mycommand
的输出管道化到文件中

编辑

使用引号会带来额外的问题。考虑:

import subprocess
import sys

argList = sys.argv[1].split()

subprocess.call(argList)
然后被称为:

python myscript.py 'ls -l > ls.out'
导致

ls: cannot access >: No such file or directory
ls: cannot access ls.out: No such file or directory

其动机是,只有我试图运行的命令的输出才应该保存在文件中。从
myscript.py
stdout
的任何其他输出都不应转到该文件。似乎需要使用
stdout
选项将管道设置为
subprocess.call()
。有没有一种方法可以直接使用参数列表,这样我就不必对它进行解析,比如
2>
2&>
标准bash或tcsh shell将解析您自己给它的命令,并将某些特殊字符解释为shell进程本身的方向(示例中的“>”字符).  被调用的程序对此没有控制权;命令行解析在调用程序之前进行

在您的示例中,您可以说:

python myscript.py ./mycommand ">" myoutput.txt
引用的“>”将告诉shell不要使用其特殊行为

子流程模块有两种操作模式;一个具有shell(通常是/bin/sh)中间进程的进程——这是指为
Popen
对象提供
shell=True
关键字参数。当您以这种方式调用它时,它将调用shell来解析参数文本,然后shell将调用从程序中删除后指定为子进程的命令

另一种默认操作模式是
shell=False
。这将创建一个子进程并直接填充其ARGV数组,而无需任何中间shell尝试解释命令中的字符


最终的结果是,如果您想从shell发出一个解释特殊字符并包含特殊字符的命令,您必须对它们进行转义或引用。如果您正在从标准库模块调用子流程,您可以将任意文本作为子流程的元素传递给be的ARGV,而不必担心它们会被中间shell进程以某种特殊方式解释。

标准bash或tcsh shell将解析您给它自己的命令,并将某些特殊字符解释为shell进程本身的方向(示例中的“>”字符)。被调用的程序对此没有控制权;命令行解析在调用程序之前进行

在您的示例中,您可以说:

python myscript.py ./mycommand ">" myoutput.txt
引用的“>”将告诉shell不要使用其特殊行为

子流程模块有两种操作模式;一个具有shell(通常是/bin/sh)中间进程的进程——这是指为
Popen
对象提供
shell=True
关键字参数。当您以这种方式调用它时,它将调用shell来解析参数文本,然后shell将调用从程序中删除后指定为子进程的命令

另一种默认操作模式是
shell=False
。这将创建一个子进程并直接填充其ARGV数组,而无需任何中间shell尝试解释命令中的字符


最终的结果是,如果您想从shell发出一个解释特殊字符并包含特殊字符的命令,您必须对它们进行转义或引用。如果您正在从标准库模块
subprocess
调用子流程,您可以将任意文本作为子流程的元素传递给be的ARGV,而不必担心它们会被中介shell进程以某种特殊方式解释。

如果您愿意接受一种依赖关系,您可以使用它(如果要从命令行向脚本传递任意命令,仍然需要使用引号)

然后您可以使用以下命令调用它:

$ python myscript.py './mycommand > myoutput.txt'
或者,如果希望在Python文件中使用类似shell的语法,可以使用(以前称为
pbs
)或:


如果您愿意接受可以使用的依赖项(如果您想从命令行向脚本传递任意命令,仍然需要使用引号)

然后您可以使用以下命令调用它:

$ python myscript.py './mycommand > myoutput.txt'
或者,如果希望在Python文件中使用类似shell的语法,可以使用(以前称为
pbs
)或:


是的,引号可以做到这一点,但是有没有办法不用引号就可以做到呢?没有引号,
>myoutput.txt
不是python命令行参数的一部分(在典型的shell中)@tpg2114什么可能是更干净或更简单的解决方案?引号有什么问题吗?如果你想用myoutput.txt做一些事情,而不是从python脚本发送stdout,那么
不是你首先想要的构造。为什么不使用日志模块来获取你想要查看和修改的脚本输出程序结果的正常标准输出…基本上,您在尝试重载此运算符时遇到了最大的麻烦…就您想做的事情而言,小时成本是巨大的…是的,引号可以做到这一点,但是有没有办法不用引号来做呢?没有引号,
>myoutput.txt
不是python命令行参数的一部分(在典型壳体中)@tpg2114什么可能是更干净或更简单的解决方案?引号有什么问题吗?如果你想用myoutput.txt做一些事情,而不是从python脚本发送stdout,那么
不是你首先想要的构造。为什么不使用日志模块来获取你想要查看和修改的脚本输出程序结果的正常标准输出…基本上,你正在试图让这个操作员超负荷工作,这是最令人头痛的…按时间计算的成本