从python调用copy时,系统找不到指定的文件

时间:2014-07-11 04:33:30

标签: python windows

这是我的copy.py:

from subprocess import call
call("copy p2.txt p3.txt")

如果在命令提示符下我使用

copy p2.txt p3.txt它复制正常。

但是当我使用python copy.py时,它会给我:

Traceback (most recent call last):
  File "copy.py", line 2, in <module>
    call("copy p2.txt p3.txt")
  File "C:\Python27\lib\subprocess.py", line 493, in call
    return Popen(*popenargs, **kwargs).wait()
  File "C:\Python27\lib\subprocess.py", line 679, in __init__
    errread, errwrite)
  File "C:\Python27\lib\subprocess.py", line 896, in _execute_child
    startupinfo)
WindowsError: [Error 2] The system cannot find the file specified

如果我用pycopy替换python调用copy,它可以正常工作。

为什么会这样?

1 个答案:

答案 0 :(得分:5)

subprocess.call()在shell中执行命令时,您还需要指定shell=True

from subprocess import call
call("copy p2.txt p3.txt", shell=True)

在这种情况下你需要使用shell=True的原因是Windows中的copy命令实际上不是可执行文件,而是shell的内置命令(如果内存服务正确)。另一方面,xcopy是一个真正的可执行文件(在%WINDIR%\System32中,通常在%PATH%中),因此可以在cmd.exe shell之外调用它。

在这个特定情况下,shutil.copy or shutil.copy2可能是可行的替代方案。

请注意,使用shell=True可能会导致安全隐患,或者正如文档所述:

  

警告:使用shell=True可能存在安全隐患。有关详细信息,请参阅Frequently Used Arguments下的警告。