Windows subprocess.Popen 不带 shell=True 的批处理文件

2024-01-09

我有一个运行的函数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?


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

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

已经一样由 @JBernardo 引用 https://stackoverflow.com/questions/16137556/windows-subprocess-popen-a-batch-file-without-shell-true#comment23054228_16137556.

那么,让我们尝试一下:

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]

所以这does如果指定完整路径,则有效。我认为当你有一个错字时这次经历 https://stackoverflow.com/questions/16137556/windows-subprocess-popen-a-batch-file-without-shell-true#comment23054022_16137556。可能是你写的.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')])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows subprocess.Popen 不带 shell=True 的批处理文件 的相关文章

随机推荐

  • VueJS - 单击时交换组件

    在我的应用程序中 我有很多按钮 当我按下按钮时 我想加载一个模板 替换所选按钮 模板 Vue component component 1 Vue component component 2 Buttons div div
  • 哪些浏览器支持 Xpath 2.0?

    我最近一直在使用 XPath 并且一直在搜索有关哪些浏览器支持 XPath 2 0 的信息 但运气不佳 我能找到的最好的是查询技术对照表 http en wikipedia org wiki Comparison of layout eng
  • 我可以同时使用 DataContract 和 Serialized 吗?

    我正在从事 WCF 服务 我的所有类都已使用 Serializable 属性进行序列化 但由于 k BackingField 属性命名问题 我使用了 DataContract 和 DataMember 属性 所以我可以同时使用这两个属性 如
  • C# 列表和枚举器的属性

    我有以下问题 我有一个列表并将字符串项目添加到该列表中 然后我从列表中创建一个枚举器 当我用循环遍历列表时MoveNext 当我直接访问枚举器时 它会起作用 当我使用枚举器属性访问枚举器时 它不起作用 这MoveNext 命令不会增加索引
  • 将 OpenCV 与 Django 结合使用

    我想在我的 Django 应用程序中使用 OpenCV 由于 OpenCV 是一个库 我认为我们可以像任何其他库一样使用它 当我尝试使用导入它时import cv2在 Django 的视图中 它工作正常 但是当我尝试在 Django 视图中
  • 页面顶部固定浮动 div 中的 Bootstrap 警报

    我有一个使用 Bootstrap 的 Web 应用程序 2 3 2 公司政策 如果不对多个 Web 应用程序进行大量测试 我们就无法升级到 3 0 我们在此应用程序中有几个长页面需要验证表单和表格 然而 由于实用和美观的原因 我们需要在页面
  • 为什么 stripe Checkout 中没有帐单地址

    我正在使用 Stripe Checkout 进行信用卡收费 但我在弹出窗口中没有看到帐单地址 为什么他们不需要帐单地址 为什么 当我准备使用信用卡付款时 我访问的任何其他网站都会要求提供帐单地址 Stripe Checkout 中已弃用帐单
  • 以字符串形式访问对象属性并设置其值

    我有一个实例Account班级 每个帐户对象都有一个所有者 引用等 我访问帐户属性的一种方法是通过访问器 例如 account Reference 但我希望能够使用动态字符串选择器访问它 例如 account PropertyName 就像
  • 读取某些元素名称中包含“-”的 XML 提要

    我正在尝试读取元素名称中包含 的 xml feed 可以在此处找到源 我是 php 新手 所以我可能会忽略一些基本的东西 我正在使用 SimpleXML 来读取提要 这是我用来解决我的问题的一些基本代码 我阅读了预测和最低温度 没有任何问题
  • 基于 DateTime 创建自定义 GroupDescription

    我正在对一些数据进行分组 PropertyGroupDescription 在大多数情况下都工作正常 但是 如果该属性是 DateTime 并且我不想将多个日期分组为一组 例如每组 30 天或其他 我将需要一个新的 GroupDescrip
  • 字节码操作模式

    字节码操作有哪些合法用途以及人们如何在实践中实现这些基于字节码操作的解决方案 Update 我应该更清楚地表明 这个问题实际上是关于人们使用什么模式和技术在字节码操作的帮助下使他们的代码飞起来 像已经提到的面向方面的编程或动态构建代理对象和
  • 如何使用 Python 从出站 Twilio 呼叫中检索信息?

    我是 Twilio 的新手 正在尝试弄清楚如何从我使用 Python 3 成功拨打的出站呼叫中检索数据 我希望能够检索诸如收件人按下的按钮之类的信息 在阅读了一点 Twilio 文档 然后有点迷失 后 我想我了解了 Twilio 的工作原理
  • @Viewchild看不到matSort

    在我的 Angular 应用程序中 我的 ViewChild 实例无法填充 HTL matSort 我的组件 ts import MatSort from angular material export class MyClassCompo
  • 卤素键盘输入示例和取消订阅事件?

    如何取消订阅除 HandleKey 之外的其他操作的键盘事件键盘输入示例 https github com slamdata purescript halogen blob master examples keyboard input sr
  • 缓冲区溢出 - 普通用户中的 SegFaults

    下面是我的代码 包括易受攻击的程序 stack c 和我的漏洞利用程序 exploit c 这段代码适用于教授为 Windows 用户发送的预打包 Ubuntu 9 我有一个朋友在他的计算机上测试了它 但在我在 iMac 上运行的 Ubun
  • 如何从 Android 设备访问本地 REST api?

    我的计算机上本地运行着一个 spring REST api 我想使用这个 api 进行 android 开发 这是我的获取请求 public static String sendGet final String url StringBuil
  • 是否可以通过动态 LINQ 进行注入?

    使用动态 LINQ 库 link http weblogs asp net scottgu archive 2008 01 07 dynamic linq part 1 using the linq dynamic query librar
  • jquery文档主体一键事件

    有人可以帮我解决这个问题吗 我有一个按钮 单击它会显示某个 div 这个 div 有几个后代 现在 我想要的是 当我单击文档中的其他位置时 但在这些后代中却没有这个div消失了 我的想法是使用 not 选择器 如下所示 button cli
  • Spark中“RDD可以存储在内存中”是什么意思?

    Spark的介绍中说 RDD 可以在查询之间存储在内存中 无需复制 http spark apache org research html 据我所知 您必须使用手动缓存 RDD cache or persist 如果我不采取任何措施 如下所
  • Windows subprocess.Popen 不带 shell=True 的批处理文件

    我有一个运行的函数lessc 安装有npm install g less gt gt gt import subprocess gt gt gt subprocess Popen lessc Traceback most recent ca