我需要date | grep -o -w '"+tz+"'' | wc -w
在本地主机上使用Python运行命令
。我使用subprocess
相同的模块,并使用check_output
需要捕获相同输出的方法。
但是,这使我出错:
Traceback (most recent call last):
File "test.py", line 47, in <module>
check_timezone()
File "test.py", line 40, in check_timezone
count = subprocess.check_output(command)
File "/usr/lib/python2.7/subprocess.py", line 537, in check_output
process = Popen(stdout=PIPE, *popenargs, **kwargs)
File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
raise child_exception-
OSError: [Errno 2] No such file or directory
您必须添加shell=True
执行shell命令。check_output
正在尝试查找名为:的可执行文件date | grep -o -w '"+tz+"'' | wc -w
,但他找不到它。(不知道为什么您从错误消息中删除了基本信息)。
看到之间的区别:
>>> subprocess.check_output('date | grep 1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.4/subprocess.py", line 603, in check_output
with Popen(*popenargs, stdout=PIPE, **kwargs) as process:
File "/usr/lib/python3.4/subprocess.py", line 848, in __init__
restore_signals, start_new_session)
File "/usr/lib/python3.4/subprocess.py", line 1446, in _execute_child
raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: 'date | grep 1'
和:
>>> subprocess.check_output('date | grep 1', shell=True)
b'gio 19 giu 2014, 14.15.35, CEST\n'
阅读有关“常用参数”的文档,以获取有关该shell
参数及其如何更改其他参数解释的更多信息。
请注意,您应该避免使用它,shell=True
因为产生外壳会带来安全隐患(即使您不执行像Shellshock这样的不受信任的输入攻击也可以执行!)。
子流程模块的文档中有一小节介绍了如何替换Shell管道。您可以通过在python中生成两个进程并使用来做到这一点subprocess.PIPE
:
date_proc = subprocess.Popen(['date'], stdout=subprocess.PIPE)
grep_proc = subprocess.check_output(['grep', '1'], stdin=date_proc.stdout, stdout=subprocess.PIPE)
date_proc.stdout.close()
output = grep_proc.communicate()[0]
您可以编写一些简单的包装函数来轻松定义管道:
import subprocess
from shlex import split
from collections import namedtuple
from functools import reduce
proc_output = namedtuple('proc_output', 'stdout stderr')
def pipeline(starter_command, *commands):
if not commands:
try:
starter_command, *commands = starter_command.split('|')
except AttributeError:
pass
starter_command = _parse(starter_command)
starter = subprocess.Popen(starter_command, stdout=subprocess.PIPE)
last_proc = reduce(_create_pipe, map(_parse, commands), starter)
return proc_output(*last_proc.communicate())
def _create_pipe(previous, command):
proc = subprocess.Popen(command, stdin=previous.stdout, stdout=subprocess.PIPE)
previous.stdout.close()
return proc
def _parse(cmd):
try:
return split(cmd)
except Exception:
return cmd
有了这个地方,你可以写pipeline('date | grep 1')
或pipeline('date', 'grep 1')
或pipeline(['date'], ['grep', '1'])
问题内容: 我有: 当我在Linux中键入命令时,该命令有效。我懂了 我究竟做错了什么? 问题答案: 试试这个:
问题内容: 以下工作并打印命令输出: 但是此操作失败(退出状态为1): 有什么建议? 问题答案: 您可以这样做:
问题内容: 我正在运行一个简单的服务器 当我向主页发出GET请求时,运行时将引发以下错误 我不明白这个错误。有任何想法吗?我正在Cloud9中工作。 我的目录结构是 问题答案: 包含路径是相对的,您需要更新路径以包含“ partials”子文件夹,例如 查看文档
在这里输入图像描述我正在尝试运行一个ejs文件,并得到错误:无法找到包含文件“partials/head”。 我已经检查了stackoverflow和github的大部分文章,但是无法解决它... 错误:在getIncludePath(C:\users\Junia\Desktop\Node\Node_Desktop\EJS\lib\EJS.js:162:13)中找不到包含文件“partials/h
我正在努力学习React,我正在使用一个私人回购开始。 我在repo目录中运行,但得到错误消息: 我已经安装了节点和纱线。
Process 结构体代表了一个正在运行的子进程,并公开了stdin(标准输入),stdout(标准输出) 和 stderr(标准错误) 句柄,通过管道和底层的进程交互。(原文:The Process struct represents a running child process, and exposes the stdin, stdout and stderr handles for int