模块操作系统和模块子进程之间的区别?

时间:2018-04-03 03:08:20

标签: python subprocess

我在Linux中创建了一个脚本,通过subprocess模块动态自动复制到文件夹中:

import sys
import subprocess


script = sys.argv
name = str(script[0])
print name

for i in range(0,10):
  fold = 'Lombriz'+str(i)
  subprocess.call(['mkdir',fold])
  subprocess.call(['cp',name,fold])

然而,当我尝试通过放置正确的windows命令在Windows cmd中执行相同的脚本时,它会抛出以下错误:

Error: subprocess.call subprocess.call (['mkdir', fold])
  [Error 2]: The system can not find the specified file.

之后,我必须使用模块os.system执行相同的脚本,并且它在Windows上完美运行。

我的问题是:子进程模块在Windows中不起作用吗? 只能在Windows中使用os.system吗?

1 个答案:

答案 0 :(得分:2)

subprocess在Windows上运行正常。

但在任何平台上,subprocess都无法调用不存在的程序。 Windows上没有名为mkdir(或MKDIR.EXE)的程序。当您在命令提示符中键入它时,它由cmd.exe作为特殊的内置命令处理。

并且,即使它确实存在,也不会调用它,因为从错误消息中你明确地传递了' mkdir',在m之前有一个空格,并且没有比任何系统上的名称。

如果您阅读了subprocess的文档,可以看到有两种解决方法:

  • 传递shell=True,因此命令将由shell(cmd.exe)执行,类似于os.system,但在各种方面更好。通常当您使用此标志时,您希望使用字符串而不是参数列表,如run(f'mkdir {fold}', shell=True)
  • 明确致电cmd.exe,例如run(['cmd', '/C', 'mkdir', fold])

但是,这里没有理由使用os.systemsubprocess。如果你想创建一个目录,只需要调用os.mkdir(或者,如果你想以递归方式进行,os.makedirs。这是跨平台的,并且尽可能简单。同样,不是运行Unix上为cp,Windows上为copy,您只能shutil.copyfile或其变体。