这个看起来很简单,所以我确信我只是错过了一个小细节。尽管如此,搜索还没有发现任何东西,而且我使用的命令在终端中逐字工作,所以我们在这里。
我需要列出一个包含数万个文件的目录中的所有文件。由于其大小,我发现
printf '%s\n' *.*
查询文件夹内容的速度比 ls
快得多。不过,与 ls
不同的是,我需要首先进入感兴趣的文件夹。没关系,我可以在终端中成功运行cd path/to/folder & printf '%s\n' *.*
。
如果我尝试在 python 脚本中执行相同的操作,该命令不会返回任何内容。它没有错误,但没有返回任何内容。它的返回速度也非常快——当我在终端中运行命令时,在返回内容列表之前仍然需要大约一两秒的时间来解析。在子进程中运行命令几乎是瞬时的。
其他详情:
这是我尝试过的示例:
cmd = ['cd', 'path/to/folder', '&', 'printf', "'%s\n'", '*.*']
result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
directory_contents = result.stdout.decode("utf-8")
...我尝试更改引号的使用,使用
Popen
和 communicate
代替 run
,使用 '&&' 代替 '&',添加 shell=True
等。如果我更改命令到一个简单的 ls path/to/folder
子进程命令工作正常,我收到一个文件名列表(最终)。我错过了什么?
cd 路径/到/文件夹可能不起作用。
未能在子进程中运行 cd ... 或 chdir(...);一定有办法,但如果您同意,请在调用您的(较小的)子流程之前更改文件夹
#wd = os.getcwd()
chdir ('path/to/folder')
cmd = ["printf", "'%s\n'", "*.*"]
result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
directory_contents = result.stdout.decode("utf-8")
#chdir (wd)