我在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
吗?
答案 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.system
或subprocess
。如果你想创建一个目录,只需要调用os.mkdir
(或者,如果你想以递归方式进行,os.makedirs
。这是跨平台的,并且尽可能简单。同样,不是运行Unix上为cp
,Windows上为copy
,您只能shutil.copyfile
或其变体。