我正在尝试编写一个脚本,以侦听目录中等待新文件的内容,然后将其发送到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
答案 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
也很有用,如果您想将输入发送到生成的进程并在每个步骤中获取相应的输出。