调用Python的copy时系统找不到指定的文件

2 投票
1 回答
2304 浏览
提问于 2025-04-18 12:53

这是我的 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.copyshutil.copy2 可能是不错的替代选择。

请注意,使用 shell=True 可能会带来安全隐患,正如文档中所说:

警告:使用 shell=True 可能会有安全风险。有关详细信息,请查看 常用参数 下的警告。

撰写回答