子进程模块无法运行命令

2023-12-01

我正在尝试对我的一组文件执行 Google 的 cpplint.py 并将结果收集到一个日志文件中。但是,我还没有成功击败子流程模块。我当前的代码在这里:

import os, subprocess

rootdir = "C:/users/me/Documents/dev/"
srcdir = "project/src/"

with open(rootdir+srcdir+"log.txt", mode='w', encoding='utf-8') as logfile:
    for subdir, dirs, files in os.walk(rootdir+srcdir):
        for file in files:
            if file.endswith(".h") or file.endswith(".cpp"):
                filewithpath=os.path.join(subdir, file)
                cmd=['c:/Python27/python.exe','C:/users/me/Documents/dev/cpplint.py','--filter=-whitespace,-legal,-build/include,-build/header_guard/', filewithpath]               
                output = subprocess.check_output(cmd)
                logfile.write(output.decode('ascii'))

尝试运行上面的代码会引发错误:

  File "C:\Python32\lib\site.py", line 159
    file=sys.stderr)
        ^ SyntaxError: invalid syntax Traceback (most recent call last):   File "C:\Users\me\Documents\dev\project\src\verifier.py", line 19, in <module>
    output = subprocess.check_output(cmd)   File "C:\Python32\lib\subprocess.py", line 511, in check_output
    raise CalledProcessError(retcode, cmd, output=output) subprocess.CalledProcessError: Command '['c:/Python27/python.exe', 'C:/users/me/Documents/dev/cpplint.py', '--filter=-whitespace,-legal,-build/include,-build/header_guard/', 'C:/users/me/Documents/dev/project/src/aboutdialog.cpp']' returned non-zero exit status 1

如果我用更简单的东西替换 cmd,例如:

cmd=['C:/WinAVR-20100110/bin/avr-gcc.exe','--version']

然后脚本将按预期工作。

我也尝试过使用单个命令字符串而不是字符串列表作为 cmd,但结果是相同的。 调试代码时,我从调试器复制了字符串列表并转换为命令行命令,并在 Windows 命令行中运行它,命令按预期运行。

运行我的脚本的Python解释器是Python 3.2。 非常感谢任何提示。


好像cpplint.py只是以非零返回代码退出 - 例如,如果它在正在检查的源文件中发现错误或“lint”,它可能会这样做。

请参阅文档子进程.check_output。请注意,如果执行的命令返回非零退出代码 then a subprocess.CalledProcessError被提出。

你可以通过观察来解决这个问题CalledProcessError, e.g.

try:
    output = subprocess.check_output(cmd)
except subprocess.CalledProcessError as e:
    # ack!  cpplint.py failed... report an error to the user?

EDIT:

The SyntaxError似乎是这里的关键,并且可能是由C:\Python32\lib在你的 PYTHONPATH 中(无论是明确的,或者,如果它是你当前的工作目录,这都可能发生)。

Python 解释器(从 1.5.2 左右开始)自动运行import site当开始的时候。因此,在这种情况下,您的脚本将执行:

c:/Python27/python.exe C:/users/me/Documents/dev/cpplint.py ...

那么Python 2.7口译员会发现C:\Python32\lib\site.py首先,尝试加载它,而不是(大概)加载C:\Python27\lib\site.py。问题是Python 3的site.py包含与 Python 2 不兼容的语法,因此启动的进程subprocess.check_output在它有机会运行之前就因语法错误而失败cpplint,这传播了CalledProcessError.

解决方案?确保 Python2 获得真正的 Python2“PYTHONPATH”,Python3 同样如此!换句话说,确保C:\Python32\lib运行 Python2 解释器时不在 PYTHONPATH 搜索路径中。

在您的情况下执行此操作的一种方法是在启动进程时设置显式环境,例如:

python2_env = {"PYTHONPATH": "path/to/python2/stuff:..."}
output = subprocess.check_output(cmd, env=python2_env)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

子进程模块无法运行命令 的相关文章

随机推荐

  • WHM64 升级后无法访问 eximstats sqlite3 db

    WHM 64 升级后 无法访问 eximstat 数据库 MySQL代码更改为PDO来访问sqlite3 db 如下 db new PDO sqlite var cpanel eximstats db sqlite3 DB USER DB
  • 将列添加到文本文件

    我有一个只有一列的数据文件 我想在左侧添加 2 列 在右侧添加 2 列 我认为一个简单的方法是使用 numpy 数组 这是我尝试过的 z np loadtxt data file dat new np zeros z shape 0 5 f
  • 数组元素的减号运算

    我有一个数组 A 11 23 32 44 56 88 55 14 78 79 和 B 44 56 88 55 14 现在使用 VBScript 我可以执行 Set手术MINUS要获得其他输出 例如 C 11 23 32 78 79 数组 A
  • NSDecimalNumber(x).intValue 返回 -2、0、15 和 199,具体取决于 x 中的小数位数 (x = 199.999...5)

    我们在业务逻辑中发现了一个有趣的案例 它完全打破了我们的逻辑 但我们不明白为什么NSDecimalNumber and Decimal表现得像它那样 我的案例游乐场如下 import Foundation let pQuantity Dec
  • 无法启动 kibana-4.1.2

    我的环境 CentOS 6 6 elasticsearch 2 0 0 rc1 rpm kibana 4 1 2 linux x64 root node2 files sestatus SELinux status enabled SELi
  • 如何在android中显示外部图像?

    我想显示外部图像 例如 http abc com image jpg 在我的 Android 手机应用程序中 谁能指导我如何实现这一目标 有很多方法可以实现您的要求 基本上 您必须使用 urlrequest 下载图像 然后使用 InputS
  • Pathways:操作 R 中父子“节点”中的事件列表

    我感兴趣的是根据预先指定的事件列表 例如诊断 手术 治疗1 治疗2 死亡 可视化患者的路径 测试数据集可能如下所示 df lt structure list ID structure c 1L 1L 1L 2L 2L 2L 2L 2L 3L
  • Node.js 模块范式的基础知识?

    我正在努力真正掌握这里的一些基本知识 我觉得这不仅阻碍了我 而且导致了蹩脚的代码 我不喜欢这样 我理解将功能代码块分解为单独模块的概念 例如路由 数据库模型等 但我很难理解如何正确编排所有这些单独模块的相互依赖的功能 让我举几个例子来说明我
  • mysqli_real_escape_string 和双引号问题

    我有这个代码 var mysqli real escape string connection POST var sql UPDATE users SET var var WHERE id id 如果变量是aaa 没关系 即使 var 是a
  • sql-server:我如何知道谁在我的数据库中?

    我有一个访问前端和sql server 后端 我想知道哪些用户当前正在使用该数据库 使用 access 或 sql server 可以做到这一点吗 在 SQL Server 中 您可以运行此存储过程 sp who2 EDIT 如果您想查看在
  • 在 Maven 中调试?

    是否可以从 Maven 启动 jdb 等调试器 我有一个pom xml成功编译项目的文件 但是 该程序挂在某处 我真的很想启动 jdb 或等效的调试器来查看发生了什么 我编译使用mvn compile并使用以下命令启动 mvn exec j
  • 如何使用 sqldf 包提取月份

    我尝试使用 sqldf 包和月份函数获取基于日期分组的视图 但出现错误 Error in sqliteSendQuery con statement bind data error in statement no such function
  • 按依赖于另一列的列进行分组

    这是我试图通过 MySQL 查询彻底解决的问题的简化视图 这不是我正在处理的实际表 如果我有下表 Name Buyer ID John Fred 4 John Smith 3 Fred Sally 2 John Kelly 1 我想要一个查
  • NTFS 连接,难以理解 API

    Update 这个问题有evolved进入一个关于NTFS filesystem filter driver如何在备份应用程序和其他需要了解的程序中使用Win32 API磁盘上的文件到底是什么 路口和重解析点是我需要考虑的关键概念 也是 N
  • MySQL 可以拆分列吗?

    我有一列包含逗号分隔的数据 1 2 3 3 2 1 4 5 6 5 5 5 我正在尝试运行一个搜索来单独查询 CSV 字符串的每个值 0
  • 基数排序算法

    我得到了一些逆向工程算法 下面的算法是基数排序 但我对代码中实际发生的情况感到非常困惑 我是算法新手 不确定代码如何对数组中的元素进行排序 我不确定哪些位与算法有关以及掩码是什么 这是代码 ArrayList
  • 是否可以使用常规 JVM 创建一个不会被任何其他线程抢占的高优先级线程?

    所以我的目标很简单 我想在 Java 中创建一个高优先级线程 而不使用 RTSJ 实时 Java VM 或其他一些专有 JVM 假设您从未创建任何垃圾 因此 GC 不会成为罪魁祸首 假设我有 4 个处理器 可行吗 如果没有 是否可以计算我的
  • 使用 Python(套接字)创建一个简单的聊天应用程序

    我正在尝试使用套接字 python 创建一个简单的聊天应用程序 客户端可以向服务器发送消息 服务器只需将消息广播给除发送消息的客户端之外的所有其他客户端 客户端有两个线程 永远运行 send 发送只是将客户端的消息发送到服务器 receiv
  • 清除 JFormattedTextField 的内容不起作用?

    我有一个JFormattedTextField它只接受 8 位数字 但是当我尝试使用退格按钮清除文本字段时 它不会删除数字的第一个字符 与删除按钮的行为也相同 我每次都必须预先使用 Esc 键来删除该字符 NumberFormat intF
  • 子进程模块无法运行命令

    我正在尝试对我的一组文件执行 Google 的 cpplint py 并将结果收集到一个日志文件中 但是 我还没有成功击败子流程模块 我当前的代码在这里 import os subprocess rootdir C users me Doc