Windows 10中的subprocess.call()返回一个无法找到该文件的错误

时间:2018-04-06 15:29:23

标签: python python-3.x subprocess

我正在开发一个unix脚本,需要在Windows 10下进行一些调整。该脚本使用子进程使用DOS命令执行文件操作。具体而言,使用子进程将文件从目录复制到当前目录的语句将返回错误消息。 正确的DOS命令是

copy "D:\tess\catalog files\TIC55234031.fts" .

然而,

ref_fits_filename="D:\TESS\catalog files\TIC55234031.fts"

subprocess.call(['copy ', ref_fits_filename,' .'])         # copy the ref fits file to here

旨在执行完全相同的操作,出错了:

Traceback (most recent call last):
  File "EBcheck.py", line 390, in 
    subprocess.call(['copy ', ref_fits_filename,' .'])         # copy the ref fits file to here
  File "C:\Users\FD-Computers\AppData\Local\Programs\Python\Python36\lib\subprocess.py", line 267, in call
    with Popen(*popenargs, **kwargs) as p:
  File "C:\Users\FD-Computers\AppData\Local\Programs\Python\Python36\lib\subprocess.py", line 709, in __init__
    restore_signals, start_new_session)
  File "C:\Users\FD-Computers\AppData\Local\Programs\Python\Python36\lib\subprocess.py", line 997, in _execute_child
    startupinfo)
FileNotFoundError: [WinError 2] Het systeem kan het opgegeven bestand niet vinden

显然,必须有一个微妙的语法错误或一个问题但我没有导致问题。 在Windows 10下是否有Python编程专家来澄清这个论坛上的问题? 这里使用的Python版本是最新的Python 3.6.4。

1 个答案:

答案 0 :(得分:2)

有很多原因:

  1. copy是内置的Windows shell,它不是可执行文件。您必须使用shell=True
  2. 你的subprocess.call(['copy ', ref_fits_filename,' .'])在参数中有空格
  3. 所以你可以做:

    subprocess.call(['copy', ref_fits_filename,'.'],shell=True)
    

    但最狡猾的方式是放弃所有这些并使用shutil.copy

    import shutil
    shutil.copy(ref_fits_filename,".")
    

    作为奖励,如果副本出错,你会得到一个干净的python异常。

    除此之外:在将Windows路径定义为文字时始终使用原始前缀:

    ref_fits_filename = r"D:\tess\catalog files\TIC55234031.fts"
    

    (我猜你将tess大写为TESS以解决\t是制表符号的问题:)