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'
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
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:
FORTRAN
,~/
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.
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