WinError 2 系统找不到指定的文件(Python)

问题描述 投票:0回答:5

我有一个 Fortran 程序,想在 python 中执行多个文件。我有 2000 个输入文件,但在我的 Fortran 代码中我一次只能运行一个文件。我应该如何在Python中调用Fortran程序?

我的脚本:

import subprocess
import glob
input = glob.glob('C:/Users/Vishnu/Desktop/Fortran_Program_Rum/*.txt')
output = glob.glob('C:/Users/Vishnu/Desktop/Fortran_Program_Rum/Output/')
f = open("output", "w")
for i in input:
    subprocess.Popen(["FORTRAN ~/C:/Users/Vishnu/Desktop/Fortran_Program_Rum/phase1.f", "--domain "+i])
f.write(i)

错误:

runfile('C:/Users/Vishnu/Desktop/test_fn/test.py', wdir='C:/Users/Vishnu/Desktop/test_fn')
Traceback (most recent call last):

   File "<ipython-input-3-f8f378816004>", line 1, in <module>
runfile('C:/Users/Vishnu/Desktop/test_fn/test.py', wdir='C:/Users/Vishnu/Desktop/test_fn')

  File "C:\Users\Vishnu\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 866, in runfile
execfile(filename, namespace)

  File "C:\Users\Vishnu\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/Vishnu/Desktop/test_fn/test.py", line 30, in <module>
subprocess.Popen(["FORTRAN ~/C:/Users/Vishnu/Desktop/Fortran_Program_Rum/phase1.f", "--domain "+i])

  File "C:\Users\Vishnu\Anaconda3\lib\subprocess.py", line 707, in __init__
restore_signals, start_new_session)

  File "C:\Users\Vishnu\Anaconda3\lib\subprocess.py", line 990, in _execute_child
startupinfo)

FileNotFoundError: [WinError 2] The system cannot find the file specified

编辑:

import subprocess
import os
input = os.path.normcase(r'C:/Users/Vishnu/Desktop/Fortran_Program_Rum/*.txt')
output = os.path.normcase(r'~/C:/Users/Vishnu/Desktop/Fortran_Program_Rum/Output/')
f = open("output", "w")
for i in input:
    exe = os.path.normcase(r'~/C:/Program Files (x86)/Silverfrost/ftn95.exe')
    fortran_script = os.path.normcase(r'~/C:/Users/Vishnu/Desktop/test_fn/test_f2py.f95')
    i = os.path.normcase(i)
    subprocess.Popen([exe, fortran_script, "--domain", i])
    f.write(i)

错误:

FileNotFoundError: [WinError 2] The system cannot find the file specified

编辑 - 2:

我已更改我的脚本如下:但错误是相同的

input = os.path.normcase(r'C:/Users/Vishnu/Desktop/Fortran_Program_Rum/*.txt')
output = os.path.normcase(r'C:/Users/Vishnu/Desktop/Fortran_Program_Rum/Output/')
f = open("output", "w")
for i in input:
    exe = os.path.normcase(r'C:/Program Files (x86)/Silverfrost/ftn95.exe')
    fortran_script = os.path.normcase(r'C:/Users/Vishnu/Desktop/test_fn/test_f2py.f95')
    i = os.path.normcase(i)
    subprocess.Popen([exe, fortran_script, "--domain", i])
    f.write(i)

错误:2

FileNotFoundError: [WinError 2] The system cannot find the file specified

错误:3 - 2017 年 3 月 15 日

import subprocess
import os
input = os.path.normcase(r'C:/Users/Vishnu/Desktop/Fortran_Program_Rum/*.txt')
output = os.path.normcase(r'C:/Users/Vishnu/Desktop/Fortran_Program_Rum/Output/')
f = open('output', 'w+')
for i in input:
    exe = os.path.normcase(r'C:/Program Files (x86)/Silverfrost/ftn95.exe')
    fortran_script = os.path.normcase(r'C:/Users/Vishnu/Desktop/Fortran_Program_Rum/phase1.f')
    i = os.path.normcase(i)
    subprocess.Popen([exe, fortran_script, "--domain", i], shell = True)
    f.write(i)

** 错误 **

PermissionError: [Errno 13] Permission denied: 'output'
python python-2.7 python-3.x bioinformatics f2py
5个回答
54
投票

Popen 需要一个用于非 shell 调用的字符串列表和一个用于 shell 调用的字符串。

使用 shell=True 调用 subprocess.Popen:

process = subprocess.Popen(command, stdout=tempFile, shell=True)

希望这能解决您的问题。

这个问题列在这里: https://bugs.python.org/issue17023


3
投票

谢谢你,你的第一个错误指导了我,解决方案也解决了我的问题!

权限错误,

f = open('output', 'w+')
,改为
f = open(output+'output', 'w+')

或者其他什么,但是你现在使用的方式是访问Python的安装目录,通常在Program Files中,并且可能需要管理员权限。

当然,您可能可以以管理员身份运行 python/您的脚本来传递权限错误


2
投票

我相信您需要

.f
文件作为参数,而不是作为命令单字符串。与
"--domain "+i
相同,我将其拆分为列表的两个元素。 假设:

  • 您已为
    FORTRAN
    可执行文件设置了路径,
  • ~/
    确实是
    FORTRAN
    可执行文件的正确方法

我会改变这一行:

subprocess.Popen(["FORTRAN ~/C:/Users/Vishnu/Desktop/Fortran_Program_Rum/phase1.f", "--domain "+i])

subprocess.Popen(["FORTRAN", "~/C:/Users/Vishnu/Desktop/Fortran_Program_Rum/phase1.f", "--domain", i])

如果这不起作用,您应该对

os.path.exists()
文件执行
.f
,并检查是否可以在没有任何路径的情况下启动
FORTRAN
可执行文件,并相应地设置路径或系统路径变量

[2017 年 3 月 6 日编辑]

原帖中详细介绍了该异常,是来自

subprocess
的 python 异常;
WinError 2
很可能是因为找不到
FORTRAN

我强烈建议您指定可执行文件的完整路径:

for i in input:
    exe = r'c:\somedir\fortrandir\fortran.exe'
    fortran_script = r'~/C:/Users/Vishnu/Desktop/Fortran_Program_Rum/phase1.f'
    subprocess.Popen([exe, fortran_script, "--domain", i])

如果您需要将正斜杠转换为后斜杠,如评论之一所建议,您可以这样做:

for i in input:
    exe = os.path.normcase(r'c:\somedir\fortrandir\fortran.exe')
    fortran_script = os.path.normcase(r'~/C:/Users/Vishnu/Desktop/Fortran_Program_Rum/phase1.f')
    i = os.path.normcase(i)
    subprocess.Popen([exe, fortran_script, "--domain", i])

[2017 年 3 月 7 日编辑]

以下行不正确:

exe = os.path.normcase(r'~/C:/Program Files (x86)/Silverfrost/ftn95.exe'

我不确定为什么你有

~/
作为每条路径的前缀,不要这样做。

for i in input:
    exe = os.path.normcase(r'C:/Program Files (x86)/Silverfrost/ftn95.exe'
    fortran_script = os.path.normcase(r'C:/Users/Vishnu/Desktop/Fortran_Program_Rum/phase1.f')
    i = os.path.normcase(i)
    subprocess.Popen([exe, fortran_script, "--domain", i])

[2017 年 3 月 7 日第二次编辑]

我不知道这个 FORTRAN 或 ftn95.exe,它是否需要 shell 才能正常运行?,在这种情况下,您需要按如下方式启动:

subprocess.Popen([exe, fortran_script, "--domain", i], shell = True)

您确实需要尝试从 python 脚本运行的工作目录手动启动命令。一旦您拥有实际运行的命令,然后构建

subprocess
命令。


0
投票

我针对类似问题的解决方案,我使用了

os

_command = f"ffmpeg -i \"{src_path}\" -ss 00:00:00.000 -vframes 1 \"{dist_path}\""
os.system(_command)

0
投票

我遇到了同样的错误,当我在路径中使用 \ 而不是 '/' 时问题就解决了

os.startfile('pdf files\\' + output_name + '.pdf')

而不是

os.startfile('pdf files/' + output_name + '.pdf')

© www.soinside.com 2019 - 2024. All rights reserved.