调用Python的copy时系统找不到指定的文件
这是我的 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
如果我把调用 python 的命令换成 xcopy,它就能正常工作。
这是什么原因呢?
1 个回答
5
当你用 subprocess.call()
来执行像在命令行中那样的命令时,你需要加上 shell=True
。
from subprocess import call
call("copy p2.txt p3.txt", shell=True)
你需要使用 shell=True
的原因是,Windows 中的 copy
命令其实并不是一个独立的可执行文件,而是命令行的一个内置命令(如果我没记错的话)。而 xcopy
则是一个真正的可执行文件(在 %WINDIR%\System32
目录下,通常这个目录在 %PATH%
中),所以它可以在不打开 cmd.exe
的情况下被调用。
在这种情况下,shutil.copy
或 shutil.copy2
可能是不错的替代选择。
请注意,使用 shell=True
可能会带来安全隐患,正如文档中所说:
警告:使用
shell=True
可能会有安全风险。有关详细信息,请查看 常用参数 下的警告。