我有一个运行lessc
的函数(与npm install -g less
一起安装):
>>> import subprocess
>>> subprocess.Popen(['lessc'])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
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
不幸的是,除非我添加shell=True
:
>>> subprocess.Popen(['lessc'], shell=True)
<subprocess.Popen object at 0x01F619D0>
如何在不使用lessc
的情况下运行shell=True
?
答案 0 :(得分:0)
将文件更改为lessc.bat,或创建调用lessc的.bat文件。这样,该文件将被Windows识别为批处理文件,并将正确执行。
根据.bat文件的位置,您可能还需要设置cwd。
答案 1 :(得分:0)
来自https://docs.python.org/3/library/subprocess.html#subprocess.Popen和https://docs.python.org/2/library/subprocess.html#subprocess.Popen:
您不需要
shell=True
来运行批处理文件或基于控制台的可执行文件。
所以,让我们尝试一下:
where lessc
实际上告诉了
C:\Users\myname\AppData\Roaming\npm\lessc
C:\Users\myname\AppData\Roaming\npm\lessc.cmd
这意味着要执行的文件是lessc.cmd
,而不是某些.bat
文件。确实:
>>> import subprocess
>>> subprocess.Popen([r'C:\Users\myname\AppData\Roaming\npm\lessc.cmd'])
<subprocess.Popen object at 0x035BA070>
>>> lessc: no input files
usage: lessc [option option=parameter ...] <source> [destination]
因此,如果您指定完整路径,此确实有效。我假设您有this experience时涉及打字错误。可能是您写了.bat
而不是.cmd
吗?
如果您不想将lessc
的完整路径修补到脚本中,则可以给自己烤一个where
:
import plaform
import os
def where(file_name):
# inspired by http://nedbatchelder.com/code/utilities/wh.py
# see also: http://stackoverflow.com/questions/11210104/
path_sep = ":" if platform.system() == "Linux" else ";"
path_ext = [''] if platform.system() == "Linux" or '.' in file_name else os.environ["PATHEXT"].split(path_sep)
for d in os.environ["PATH"].split(path_sep):
for e in path_ext:
file_path = os.path.join(d, file_name + e)
if os.path.exists(file_path):
return file_path
raise Exception(file_name + " not found")
然后您可以编写:
import subprocess
subprocess.Popen([where('lessc')])