32ビットの64ビットシステムでpython 2.7がインストールされている場合、以下を実行しようとしています。
_import subprocess
p = subprocess.call('dir', Shell=True)
print p
_
しかし、これは私に与えます:
_Traceback (most recent call last):
File "test.py", line 2, in <module>
p = subprocess.call('dir', Shell=True)
File "C:\Python27\lib\subprocess.py", line 522, in call
return Popen(*popenargs, **kwargs).wait()
File "C:\Python27\lib\subprocess.py", line 709, in __init__
errread, errwrite)
File "C:\Python27\lib\subprocess.py", line 957, in _execute_child
startupinfo)
WindowsError: [Error 2] The system cannot find the file specified
_
私がターミナルにいるなら...
_dir
_
...もちろん、現在のフォルダの内容を印刷します。
ShellパラメータをShell = Falseに変更しようとしました。
編集:実際には、パス上の実行可能ファイルをsubprocess.call()
で呼び出すことはできません。ステートメントp = subprocess.call('dir', Shell=True)
は別のマシンで正常に動作し、関連していると思います。
私が行った場合
_ subprocess.call('PATH', Shell=True)
_
それから私は得る
_Traceback (most recent call last):
File "test.py", line 4, in <module>
subprocess.call('PATH', Shell=True)
File "C:\Python27\lib\subprocess.py", line 522, in call
return Popen(*popenargs, **kwargs).wait()
File "C:\Python27\lib\subprocess.py", line 709, in __init__
errread, errwrite)
File "C:\Python27\lib\subprocess.py", line 957, in _execute_child
startupinfo)
WindowsError: [Error 2] The system cannot find the file specified
_
私が行った場合:
_import os
print os.curdir
_
それから私は得る
_.
_
上記はすべて、管理者モードで起動した端末で実行されます。
COMSPEC
環境変数に問題があると思います:
>>> import os
>>> os.environ['COMSPEC']
'C:\\Windows\\system32\\cmd.exe'
>>> import subprocess
>>> subprocess.call('dir', Shell=True)
(normal output here)
>>> os.environ['COMSPEC'] = 'C:\\nonexistent.exe'
>>> subprocess.call('dir', Shell=True)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\Python27\lib\subprocess.py", line 493, in call
return Popen(*popenargs, **kwargs).wait()
File "c:\Python27\lib\subprocess.py", line 679, in __init__
errread, errwrite)
File "c:\Python27\lib\subprocess.py", line 896, in _execute_child
startupinfo)
WindowsError: [Error 2] The system cannot find the file specified
トレースバックで指摘されているように、subprocess.py
を調べて_execute_child
関数を調べることで、この潜在的な問題を発見しました。そこで、if Shell:
で始まるブロックが見つかります。このブロックは、環境を検索して変数を探し、それを使用してプロセスの起動に使用される引数を作成します。
反対票を投じる前に、この回答を投稿した後に質問が編集されたことに注意してください。
私は os.listdir
があなたのケースに適していると思います:
>>> import os
>>> os.listdir()
['1.txt', '2.txt', '3.txt', 'DLLs', 'Doc', 'e.txt', 'include', 'Lib', 'libs', 'LICENSE.txt', 'm.txt', 'msvcr100.dll', 'NEWS.txt', 'py.exe', 'python.exe', 'python33.dll', 'pythonw.exe', 'pyw.exe', 'README.txt', 'Scripts', 't.txt', 'tcl', 'Tools']
コマンドライン自体でそれを実行したいが、それを呼び出したいだけの場合は、os.sytem
を使用できます。
os.system('dir')
これによりコマンドが実行されますが、0
が返され、保存できません。
私以外の誰かがこれを(3.4) docs にすぐに表示しない場合:
Shell = TrueのWindowsでは、COMSPEC環境変数はデフォルトのシェルを指定します。 WindowsでShell = Trueを指定する必要があるのは、実行するコマンドがシェルに組み込まれている場合のみです(dirやcopyなど)。バッチファイルまたはコンソールベースの実行可能ファイルを実行するために、Shell = Trueは必要ありません。
注Shell = Trueを使用する前に、 セキュリティ上の考慮事項 セクションをお読みください。
shell = Trueを使用します。これでうまくいきます。