在安装了32位python 2.7的64位系统中,我尝试执行以下操作:
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
然后我得到
.
以上所有操作都在以管理员模式启动的终端中执行。
答案 0 :(得分:14)
我认为您的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:
开头的块,它将在环境中搜索所述变量并使用它来创建用于启动该过程的参数。
答案 1 :(得分:5)
在downvote之前,请注意我在发布此答案后编辑了问题。
我认为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
并且您无法存储它。
答案 2 :(得分:3)
如果除了我以外的任何人都没有立即在(3.4)docs中看到这一点:
在具有shell = True的Windows上,COMSPEC环境变量指定 默认的shell。您唯一需要指定shell = True的时间 Windows是您希望执行的命令内置于 shell(例如dir或copy)。您不需要shell = True来运行批处理 文件或基于控制台的可执行文件。
注意在使用shell = True之前阅读Security Considerations部分。
答案 3 :(得分:0)
use Shell = True,它对我有用。