如何在python子进程中使用linux命令
我有如下linux命令:如何在python子进程中使用linux命令,python,linux,unix,subprocess,Python,Linux,Unix,Subprocess,我有如下linux命令: find /data/*/hr/ -printf "%f: %p: %u: %g %m (%M) \n" 如何在python子进程check_输出中使用 我试过下面的方法,但没有成功 file_name = "/data/*/%s/" % (filename) get_perm = check_output(["find", file_name, "-printf", '\"%f: %p: %u: %g %m (%M) \n\"']) 我得到的错误是: fin
find /data/*/hr/ -printf "%f: %p: %u: %g %m (%M) \n"
如何在python子进程check_输出中使用
我试过下面的方法,但没有成功
file_name = "/data/*/%s/" % (filename)
get_perm = check_output(["find", file_name, "-printf", '\"%f: %p: %u: %g %m (%M) \n\"'])
我得到的错误是:
find:'/data/*/hr/':没有这样的文件或目录
回溯(最近一次呼叫最后一次):
文件“handover.py”,第90行,在
get\u perm=检查输出([“查找”,文件名,“-printf”,“\%f:%p:%u:%g%m(%m)\n\”]))
文件“/usr/lib64/python2.7/subprocess.py”,第573行,在check_输出中
引发被调用的进程错误(retcode,cmd,output=output)
subprocess.CalledProcessError:命令“['find','/data/*/hr/','-printf','%f:%p:%u:%g%m(%m)\n']”返回了非零退出状态1
由于指定的文件不存在,因此出现此错误。如果直接在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)
根据报告:
如果返回代码[from subprocess.check_output]为非零,则会引发CalledProcessError。CalledProcessError对象将在returncode属性中包含返回代码,在output属性中包含任何输出
我建议您将check_输出调用包装为try..except,并捕获被调用的进程错误
或者,如果您确实不想处理该异常,可以执行以下命令:
x=$(查找~/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\u 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\"'])
通过展开任何*
s和一些其他特殊字符,只需生成与给定表达式匹配的路径名数组。最后
我找到了下面的方法
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()
这就解决了我的问题您在
-printf
之后缺少一个逗号,是否有任何输出?您是否收到错误(即调用的处理错误?)。如果它因为不喜欢-printf“%f:%p:…
参数而转储,它应该会引发一些问题Python也在将字符串中的\n
转换为文字换行符,当找到它时,这可能会很奇怪。您还可以避免转义”
chars通过使用”
chars将字符串文字包装在.Edited Post中,并提供可能的输出。虽然确实没有找到文件,但问题可能是路径中的*
应该展开。@MichaelMior很好。如果您设置shell=True
,它将扩展splat。您是对的。添加shell=True
是一个简单的解决方案:)嗨,迈克尔,它工作得很好。。但问题是文件名“/data/*/fin/”。如果fin不存在。它将列出其他值。如果fin没有退出。我希望不会得到这样的文件或目录error@gopinara它将列出其他文件,因为您有一个尾随斜杠,find
命令将其解释为您希望列出/fin/中包含的所有文件/目录。尝试删除尾部斜杠。您还可以指定要查找的类型,以将结果仅限于文件或目录,例如,find/data/*/fin-type f
。此外,要查找的第一个参数通常是要在其中搜索文件或目录的目录。也许你需要类似于find/data/*/fin-type f-name你的文件名。ext
我尝试删除斜杠并添加-type d。同样的结果你可能只想检查glob.glob(file\u name)
是否生成空数组,如果是,根本不运行该命令。