相关文章推荐
痴情的雪糕  ·  the type initializer ...·  1 年前    · 
行走的石榴  ·  access ...·  1 年前    · 
想旅行的遥控器  ·  button - WPF How do I ...·  1 年前    · 
活泼的铁链  ·  drawing - Using ...·  1 年前    · 

获取lsof命令的输出 Python 3.5

2 人关注

我想做一个脚本,监听一个等待新文件的目录,然后发送至Nextcloud。这些文件可能是大文件,所以我想在发送前检查它们是否完整。我想使用lsof +D path/to/directory,并检查文件是否在命令的输出中,如果文件不在输出中,就发送它们。代码会是这样的。

command=list()
command.append("lsof")
command.append("+D")
command.append("/path/to/dir")
lsof = subprocess.check_output(command, stderr = subprocess.STDOUT)

但我得到subprocess.CalledProcessError返回的非零退出状态1

谁能帮助执行命令并将输出结果输入变量?

EDIT:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/subprocess.py", line 626, in check_output
    **kwargs).stdout
  File "/usr/lib/python3.5/subprocess.py", line 708, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['lsof', '+D', '/home/CLI2Cache/sync']' returned non-zero exit status 1
    
3 个评论
你能提供完整的堆栈跟踪吗?从答案的角度来看,像这样的问题是很难解决的,因为我们无法复制你的环境。你正在进行一个系统调用:所以环境将是很重要的。
试着去掉stderr、等号和subprocess.STDOUT之间的空格,看起来像 lsof = subprocess.check_output(command, stderr=subprocess.STDOUT)
我已经用完整的跟踪记录编辑了帖子。我试着去掉stderr之间的空格,但没有变化。
linux
python-3.x
Alberto Sueiro
Alberto Sueiro
发布于 2018-08-03
1 个回答
Jay
Jay
发布于 2018-08-03
已采纳
0 人赞同

这方面有几个解决方法。你可以在 check_output 中使用 shell=True 。-

lsof = subprocess.check_output(command, shell=True, stderr = subprocess.STDOUT)

请注意,shell=True并不安全,因为它还允许访问大量的shell命令,如果命令是用户指定的或者没有经过适当处理,可能会导致一些漏洞。请通过this以了解风险。

一个更好的方法是使用subprocess.Popen -

lsof = subprocess.Popen(command, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
    output, errs = lsof.communicate(timeout=20)