web-dev-qa-db-ja.com

WinError 2システムは指定されたファイルを見つけることができません(Python)

Fortranプログラムがあり、それをpython=複数のファイルに対して実行します。2000の入力ファイルがありますが、Fortranコードでは一度に1つのファイルしか実行できません。どのようにすればよいですか? PythonでFortranプログラムを呼び出しますか?

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

エラー:

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

**エラー**

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

Popenは、Shell以外の呼び出しには文字列のリストを、Shell呼び出しには文字列のリストを想定しています。

Shell = Trueを指定してsubprocess.Popenを呼び出します。

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

うまくいけば、これで問題が解決します。

この問題はここにリストされています: https://bugs.python.org/issue1702

5
nevihs

コマンドの単一の文字列としてではなく、パラメータとして_.f_ファイルを指定する必要があると思います。リストの2つの要素に分割する_"--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])
_

それが機能しない場合は、_.f_ファイルに対してos.path.exists()を実行し、パスなしでFORTRAN実行可能ファイルを起動できることを確認し、それに応じてパスまたはシステムパス変数を設定します。

[編集2017年3月6日]

例外として、元の投稿に詳細が記載されているpython subprocessからの例外です。_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])
_

コメントの1つで提案されているように、スラッシュをバックスラッシュに変換する必要がある場合は、次のようにすることができます。

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

[編集7-Mar-2017]

次の行は正しくありません。

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

[第2版2017年3月7日]

私はこのFORTRANまたはftn95.exeを知りませんが、適切に機能するためにシェルが必要ですか?この場合、次のように起動する必要があります。

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

pythonスクリプトが動作している作業ディレクトリから手動でコマンドを起動する必要があります。実際に機能しているコマンドを取得したら、subprocessコマンドを作成します。

1

ありがとう、最初のエラーがここで私を導き、解決策も私のものを解決します!

権限エラーの場合は、f = open('output', 'w+')f = open(output+'output', 'w+')に変更します。

または何か他のものですが、現在使用している方法は、Pythonのインストールディレクトリにアクセスすることです。これは通常Program Filesにあり、おそらく管理者権限が必要です。

確かに、おそらくpython/yourスクリプトを管理者として実行して、許可エラーを渡すことができます。

1
Sphynx-HenryAY