关于python:windows 10中的subprocess.call()返回一个无法找到文件的错误

subprocess.call() in windows 10 returns an error that it can't find the file

我正在编写一个Unix脚本,在Windows10下工作需要一些调整。脚本使用子进程使用DOS命令执行文件操作。具体来说,使用子进程将文件从目录复制到当前目录的语句将返回错误消息。正确的DOS命令是

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

然而,

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

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

其目的是执行完全相同的操作,但出现了错误:

1
2
3
4
5
6
7
8
9
10
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

显然,一定有一个微妙的语法错误或者一个我没有想到的问题导致了这个问题。有没有在Windows10下进行python编程的专家来澄清这个论坛上的问题?这里使用的python版本是最新的python 3.6.4。


原因很多:

  • copy是一个内置的windows shell,它不是一个可执行文件。你必须使用EDOCX1[1]
  • 你的subprocess.call(['copy ', ref_fits_filename,' .'])在论点中有空格
  • 所以你可以这样做:

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

    但是,最可能的方法是放弃所有这些,使用shutil.copy

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

    另外,如果拷贝出错,您将得到一个干净的python异常。

    旁白:将Windows路径定义为文本时始终使用原始前缀:

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

    (我猜你把tess改为tess,以解决\t是制表字符这一事实。)