繁体   English   中英

如何在子进程python中使用linux命令

[英]How to use linux command in subprocess python

我有如下的linux命令:

 find /data/*/hr/ -printf "%f: %p: %u: %g %m (%M) \n"

我如何在python子进程check_output中使用

我已经尝试过以下内容,但无法正常工作

 file_name = "/data/*/%s/" % (filename)
 get_perm = check_output(["find", file_name, "-printf", '\"%f: %p: %u: %g %m (%M) \n\"'])

我得到的错误:

find: ‘/data/*/hr/’: No such file or directory
Traceback (most recent call last):
  File "handover.py", line 90, in <module>
    get_perm = check_output(["find", file_name, "-printf", '\"%f: %p: %u: %g %m (%M) \n\"'])
  File "/usr/lib64/python2.7/subprocess.py", line 573, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['find', '/data/*/hr/', '-printf', '"%f: %p: %u: %g %m (%M) \n"']' returned non-zero exit status 1

最后,

我发现下面的方法

cmd = "find /data/*/{}/* -printf \"%f:%p:%u:%g:%m\n\"".format(filename)
info = subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True)
print info.stdout.read()

这解决了我的问题

您收到此错误,因为指定的文件不存在。 如果直接在Shell中运行命令,您将得到相同的响应。

例如,以下将按预期工作:

import subprocess
import os

file_name = os.path.join(os.getcwd(), 'test.txt')
with open(file_name, 'w') as f:
    f.write('hello world')

get_perm = subprocess.check_output([
    "find",
     file_name,
     "-printf",
    '"%f: %p: %u: %g %m (%M) \n"'
    ], shell=True)

print(get_perm)
os.remove(file_name)

根据文档

如果[从subprocess.check_output]返回的代码不为零,则会引发CalledProcessError。 CalledProcessError对象将在returncode属性中具有返回码,在output属性中具有任何输出。

我建议您将try_output调用包装在try..except中,并捕获CalledProcessError。

另外,如果您确实不想处理该异常,则可以执行以下命令:

x=$(find ~/data/*/hr/ -printf "%f: %p: %u: %g %m (%M) \\n" 2>/dev/null || true) && echo $x

这将永远不会返回非零值,并且只会在文件存在的情况下包含输出。

编辑正如Michael所指出的,“ *”没有扩大。 但是,如果设置shell=True ,它将成功。 尝试如下修改命令:

 file_name = "/data/*/%s/" % (filename)
 get_perm = check_output(["find", file_name, "-printf", '"%f: %p: %u: %g %m (%M) \n"'], shell=True)

当您在命令行上调用时,您的shell将在/data/*/hr/展开* 通过check_output直接调用该函数会导致find从字面上查找目录/data/*/hr/ 您可以在传递给find之前使用glob模块扩展路径:

import glob

file_name = "/data/*/%s/" % (filename)
get_perm = check_output(["find"] + glob.glob(file_name) + ["-printf", '\"%f: %p: %u: %g %m (%M) \n\"'])

glob.glob只是通过扩展任何* s和其他一些特殊字符来生成与给定表达式匹配的路径名数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM