获取lsof命令Python 3.5的输出

时间:2018-08-02 17:12:46

标签: linux python-3.x

我正在尝试编写一个脚本,以侦听目录中等待新文件的内容,然后将其发送到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

有人可以帮助执行命令并将输出输出到变量中吗?

编辑:

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

1 个答案:

答案 0 :(得分:0)

有两种解决方法。您可以在shell=True-

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

请注意,shell=True是不安全的,因为它还可以访问许多Shell命令,如果该命令是用户指定的或未正确清理的话,可能会导致某些漏洞。请通过this来了解风险。

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

lsof = subprocess.Popen(command, stderr = subprocess.STDOUT)
try:
    output, errs = lsof.communicate(timeout=20)
except TimeoutExpired:
    lsof.kill()
    output, errs = proc.communicate()

communicate也很有用,如果您想将输入发送到生成的进程并在每个步骤中获取相应的输出。