Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python子进程中使用linux命令_Python_Linux_Unix_Subprocess - Fatal编程技术网

如何在python子进程中使用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

我有如下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\"'])
我得到的错误是:

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)
是否生成空数组,如果是,根本不运行该命令。