web-dev-qa-db-fra.com

WinError 2 Le système ne peut pas trouver le fichier spécifié (Python)

J'ai un programme Fortran et je veux l'exécuter en python pour plusieurs fichiers. J'ai 2000 fichiers d'entrée mais dans mon code Fortran je ne peux exécuter qu'un seul fichier à la fois. Comment dois-je appeler le programme Fortran en python?

Mon script:

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)

Erreur:

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

Modifier:

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)

Erreur:

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

Modifier - 2:

J'ai changé mon script comme ci-dessous: mais l'erreur est la même

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)

Erreur: 2

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

Erreur: 3 - 15-03-2017

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)

** Erreur **

PermissionError: [Errno 13] Permission denied: 'output'
13
Jone

Popen attend une liste de chaînes pour les appels non Shell et une chaîne pour les appels Shell.

Appelez subprocess.Popen avec Shell = True:

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

J'espère que cela résout votre problème.

Ce problème est répertorié ici: https://bugs.python.org/issue1702

5
nevihs

Je pense que vous devez .f Fichier en tant que paramètre, pas en tant que chaîne de commande unique. idem avec le "--domain "+i, que je diviserais en deux éléments de la liste. En admettant que:

  • vous avez défini le chemin d'accès pour l'exécutable FORTRAN,
  • le ~/ est en effet la bonne façon pour l'exécutable FORTRAN

Je changerais cette ligne:

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])

Si cela ne fonctionne pas, vous devez faire une os.path.exists() pour le fichier .f, Et vérifier que vous pouvez lancer l'exécutable FORTRAN sans aucun chemin, et définir le chemin ou variable de chemin d'accès système en conséquence

[EDIT 6-Mar-2017]

Comme l'exception, détaillée dans le message d'origine, est une exception python de subprocess; il est probable que WinError 2 Soit parce qu'il ne peut pas trouver FORTRAN

Je vous suggère fortement de spécifier le chemin complet de votre exécutable:

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])

si vous devez convertir les barres obliques en barres obliques inverses, comme suggéré dans l'un des commentaires, vous pouvez le faire:

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])

[EDIT 7-Mar-2017]

La ligne suivante est incorrecte:

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

Je ne sais pas pourquoi vous avez ~/ Comme préfixe pour chaque chemin, ne faites pas ça.

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])

[2e EDIT 7 mars 2017]

Je ne connais pas ce FORTRAN ou ftn95.exe, at-il besoin d'un shell pour fonctionner correctement?, Auquel cas vous devez lancer comme suit:

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

Vous devez vraiment essayer de lancer la commande manuellement à partir du répertoire de travail à partir duquel votre script python fonctionne. Une fois que vous avez la commande qui fonctionne réellement, puis créez le subprocess commande.

1
Edwin van Mierlo

merci, votre première erreur me guide ici et la solution résout aussi la mienne!

pour l'erreur d'autorisation, f = open('output', 'w+'), changez-la en f = open(output+'output', 'w+').

ou autre chose, mais la façon dont vous utilisez maintenant est d'avoir accès au répertoire d'installation de Python qui normalement dans Program Files, et il a probablement besoin d'une autorisation d'administrateur.

à coup sûr, vous pourriez probablement exécuter python/votre script en tant qu'administrateur pour transmettre une erreur d'autorisation

1
Sphynx-HenryAY