4

我有一个运行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

4

2 回答 2

1

来自https://docs.python.org/3/library/subprocess.html#subprocess.Popenhttps://docs.python.org/2/library/subprocess.html#subprocess.Popen

您不需要shell=True运行批处理文件或基于控制台的可执行文件。

正如@JBernardo 已经引用的那样

所以,让我们试试:

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]

因此,如果您指定完整路径,这确实有效。我想当你有这种经历时,有一个错字。可能是你写.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')])
于 2018-11-11T11:59:47.137 回答
0

将文件更改为lessc.bat,或创建调用lessc 的.bat 文件。这样该文件将被 Windows 识别为批处理文件并正确执行。

除此之外,您可能还需要设置 cwd,具体取决于 .bat 文件的位置。

于 2013-08-12T21:42:52.523 回答