使用 Python 将包含双引号的参数传递给子进程

2023-11-28

我正在寻找一种方法来将包含双引号的参数传递给 python 的子进程模块,而不需要转义双引号。

当参数周围有引号时,我见过这个问题被问过几次,但答案通常是删除引号。我遇到的问题是引号是参数的一部分,必须传递给脚本,而不能在每个引号前添加反斜杠

example:

我正在调用 subprocesTest.bat,这是一个简单的批处理脚本,它接受一个参数并回显它:

echo "%~1"

我使用包含引号的参数从 python 调用批处理脚本:

import subprocess
test_string = 'Bill said "Hi!"'
cmd = ["subprocesTest.bat",
       test_string
       ]

p = subprocess.Popen(cmd)
p.wait()

预期输出:

“比尔说‘嗨!’”

实际输出:

”比尔说“嗨!””

从命令行调用相同的批处理脚本时,我可以获得预期的输出,如下所示:

subprocesTest.bat“比尔说“嗨!””

查看源代码,subprocess.py 的 list2cmdline 函数记录如下:

 3) A double quotation mark preceded by a backslash is
   interpreted as a literal double quotation mark.

但是,如果我单步执行此函数,我发现没有任何方法可以在不添加反斜杠的情况下传递双引号:

        elif c == '"':
            # Double backslashes.
            result.append('\\' * len(bs_buf)*2)
            bs_buf = []
            result.append('\\"')

所以我有两个问题...

  • 是否可以将 arg 传递给包含 double 的子进程 引用时不加反斜杠
  • 如果不可能,有人可以向我解释为什么该功能 是这样设计的吗?函数文档字符串中的第三项 似乎表明我可以通过在前面添加一个字面引用来传递 反斜杠,但这并没有产生我正在寻找的行为。 我读的文档错了吗?

以下是提出此问题的其他线程,并通过不使用引号来解决:

  • 使用 subprocess 模块将双引号传递给 Python 中的命令
  • 我如何告诉子流程停止转义我的报价?

对于我实际上想在论证中传递引号的情况,我没有看到任何回应


1) 是的,但可能不适用于 Windows 和/或使用 .bat 文件。例如,当您运行与此等效的 Windows 时会发生什么:

import subprocess

test_string = 'Bill said "Hi!"'

cmd = ["./myprog.py",
       test_string
       ]

p = subprocess.Popen(cmd)
p.wait()

myprog.py:

#!/usr/bin/env python

import sys

print '"{}"'.format(sys.argv[1])

2)好吧,下面的内容似乎有点含糊:

"Bill said "Hi!""

是带引号的字符串吗:

"Bill said " 

后跟不带引号的字符串:

Hi!

后跟带引号的空白字符串:

""

?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python 将包含双引号的参数传递给子进程 的相关文章

随机推荐

  • 使用双指针作为参数

    请找到如下所示的代码片段 include
  • 如何通过 mmap 映射内存指针进行写入以立即刷新?

    在双 ARM 处理器系统 确切地说是 Xilinx Zynq 上使用 dev mem 和 mmap 时 我遇到了似乎是缓存的问题 我的配置是不对称的 一个处理器运行 Linux 另一个处理器运行裸机应用程序 它们通过不在 Linux 虚拟内
  • Windows 8 fat 二进制文件(适用于 x86 和 ARM 的 exe)

    有谁 这里 知道 Windows 8 是否会有一种可以用 Visual Studio 2012 编译的胖 exe 并且在 ARM 和 x86 机器上都支持 我猜不会 因为据我所知 您无法创建执行 32 或 64 位代码的胖二进制文件 据我所
  • 从原始位到 jpeg,无需写入文件

    我有一个实时应用程序 它接收以 base64 编码的 jpg 图像 我不知道如何在 matlab 中显示图像 而不必将图像保存在磁盘中并随后打开它 这是我到目前为止的代码 它在显示图像之前将图像保存在磁盘中 raw base64decode
  • 如何在ash shell中保持程序在后台运行

    我需要通过 SSH 连接到嵌入式设备 启动后台程序 然后断开连接并保持后台进程运行 问题是嵌入式设备正在使用 ash shell 不是 bash 或其他任何东西 因此 nohup 和 screen 不可用 我还没有找到任何方法来断开灰烬中的
  • Android Edittext 中输入类型为数字的多行是否可能?

    当android edittext输入类型为数字时 是否可以制作多行 我已经在 xml 文件中尝试过以下内容 android inputType number textMultiLine 但这没有用 当输入类型为数字时 是否无法制作多行 请
  • Jersey 2.0 的依赖注入

    在没有任何 Jersey 1 x 知识的情况下从头开始 我很难理解如何在 Jersey 2 0 项目中设置依赖项注入 我还了解到 HK2 在 Jersey 2 0 中可用 但我似乎找不到有助于 Jersey 2 0 集成的文档 Manage
  • 在 Android 中使用网络服务发现出现内部错误

    在第一次使用示例和 NSDManager 实现期间开发者页面上的教程 应用程序成功启动发现并找到设备 不过现在好像已经坏掉了 程序启动时 经过一番初始化后 代码进入如下方法并成功运行 public void discoverServices
  • 如何向 Outlook 发送富文本格式的电子邮件?

    通过分配 text html 内容类型字符串以 HTML 格式发送电子邮件 到 Outlook 非常有效 如下所示 using MailMessage message new MailMessage message From new Mai
  • 对数组字段执行更新时,无法使用字符串字段名称 [$] 附加到数组

    rowsI 尝试对记录数组中的每个字段执行 mongodb 更新 示例架构如下 id ObjectId 508710f16dc636ec07000022 summary uid ABCDEF username bigcheese name
  • 如何有选择地导入 ES2015 模块函数,但具有命名空间?

    我正在开始使用 Rollup 和 D3 版本 4 它是用 ES2015 模块编写的 我使用传统的 D3 命名空间 d3 编写了一些代码 现在我想使用 Rollup 创建自定义捆绑包 我想使用 tree shaking 因为我可能只使用 d3
  • 如何确保 Python while 循环需要特定的时间来运行?

    我正在用 while 循环读取串行数据 但是 我无法控制采样率 代码本身似乎需要 0 2 秒才能运行 所以我知道我无法比这更快了 但我希望能够精确控制采样速度 我觉得我可以使用 睡眠 来做到这一点 但问题是 在不同的点 循环本身可能需要更长
  • 检查 Firebase 中是否存在文档并根据图标返回

    我想检查 Firebase 集合中是否存在特定文档 据此 我的应用程序应该显示一个彩色图标或灰色图标 我试图用一个返回布尔值的方法来解决这个问题 在我的构建小部件中 我调用该方法并分配正确的图标 这是我检查文档是否存在的方法 checkIf
  • 设置自定义字体的自定义字体内存泄漏

    以下用于设置自定义字体的代码会减慢我的整个应用程序的速度 我该如何修改它以避免内存泄漏并提高速度并很好地管理内存 public class FontTextView extends TextView private static final
  • 使用递归的幂函数

    我必须用Java 编写一个power 方法 它接收两个整数 它们是正数还是负数并不重要 它的复杂度应该是O logN 它还必须使用递归 我当前的代码得到两个数字 但我一直输出的结果为零 我不明白为什么 import java util Sc
  • MVVM 中的控制器,如何从视图模型获取信息到它的控制器?

    我们正在使用 MVVM 模式构建一个应用程序 我们有使用 DI 连接所有视图和视图模型的控制器 我见过的所有 MVVM 示例都非常简单并且只有 1 个视图 视图模型如何 应该如何与控制器对话 控制器了解模型和视图 视图模型是否应该将事件发送
  • 如何复制包含除标识列之外的每一列的行 (SQL Server 2005)

    My code SELECT INTO t FROM CTABLE WHERE CID cid get data put into a temp table ALTER TABLE t DROP COLUMN CID remove prim
  • Java Hadoop Mapper 如何发送多个值

    我的映射器需要发送以下元组
  • 为什么 C++ 允许将整数赋给字符串?

    我今天在程序中遇到了一个有趣的情况 我无意中将一个无符号整数分配给了 std string VisualStudio C 编译器没有给出任何警告或错误 但我在运行项目时碰巧注意到了这个错误 它给了我的字符串垃圾字符 代码如下 std str
  • 使用 Python 将包含双引号的参数传递给子进程

    我正在寻找一种方法来将包含双引号的参数传递给 python 的子进程模块 而不需要转义双引号 当参数周围有引号时 我见过这个问题被问过几次 但答案通常是删除引号 我遇到的问题是引号是参数的一部分 必须传递给脚本 而不能在每个引号前添加反斜杠