web-dev-qa-db-ja.com

Pythonでsubprocess.call( 'dir'、Shell = True)を使用するときに指定されたファイルが見つかりません

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
_

それから私は得る

_.
_

上記はすべて、管理者モードで起動した端末で実行されます。

17
tuple_cat

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:で始まるブロックが見つかります。このブロックは、環境を検索して変数を探し、それを使用してプロセスの起動に使用される引数を作成します。

15
zigg

反対票を投じる前に、この回答を投稿した後に質問が編集されたことに注意してください。

私は 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が返され、保存できません。

6
aIKid

私以外の誰かがこれを(3.4) docs にすぐに表示しない場合:

Shell = TrueのWindowsでは、COMSPEC環境変数はデフォルトのシェルを指定します。 WindowsでShell = Trueを指定する必要があるのは、実行するコマンドがシェルに組み込まれている場合のみです(dirやcopyなど)。バッチファイルまたはコンソールベースの実行可能ファイルを実行するために、Shell = Trueは必要ありません。

注Shell = Trueを使用する前に、 セキュリティ上の考慮事項 セクションをお読みください。

3
Tom Grundy

shell = Trueを使用します。これでうまくいきます。

0
Malware_656