如果在 bash 中通过管道传输,使用 subprocess 和 xclip 的 Python 脚本会挂起

2024-03-15

我有一个 python 脚本,需要将一些值输出到 stdin 并将另一个字符串复制到剪贴板。我正在使用该模块subprocess执行xclip效用通过Popen像这样的东西:

# clip.py
import subprocess
from subprocess import Popen

print('PRINT_ME')
p1 = Popen(['xclip', '-selection', 'clipboard'], stdin=subprocess.PIPE)
p1.communicate(input=('PASTE_ME'.encode()))

该脚本按预期工作:PRINT_ME在 bash 中得到回应并且PASTE_ME可以粘贴并立即返回。

当脚本输出通过管道传输到另一个命令时会出现问题。假设有人想重定向到一个文件和标准输入使用tee:

$ python clip.py|tee file.txt

该程序按预期工作但不返回,即 shell 不交回控制权。

如何解决这个问题?

一些重要信息: the xclip公用事业forks它本身(为了应对 X 上剪贴板的实现)维护可复制的字符串,在 shell 中使用时它立即返回(它分叉到后台)。看来外壳正在连接两者clip.py and xclip标准输入/标准输出到tee.
If xclip -selection clipboard被发现使用ps u并杀死了命令返回。

我正在使用Python 3.4。
Thanks


这不是由于分叉xclip,这是由于Python如何处理Popen.wait()(通过您的调用来调用communicate()) - 从Python的角度来看xclip(默认情况下是静默的)没有关闭它的流,所以它等待...这就是为什么除了Python移动过去你的之外一切正常p1.communicate()当将其流传输到其他东西时(tee在这种情况下) - 它等待所有文件句柄关闭...

您可以手动打开和关闭流,也可以仅配置xclip将 STDIN 过滤为 STDOUT 并使 Python 满意:

import subprocess

p1 = subprocess.Popen(['xclip', '-selection', 'clipboard', '-f'], stdin=subprocess.PIPE)
p1.communicate(input=('PASTE_ME'.encode()))
# etc.

没有测试过,但应该可以。如果你不想为xclip要打印到当前的 STDOUT,只需在实例化时重定向它subprocess.Popen() to None (or subprocess.DEVNULL对于 Python 3.x)或您想要的任何其他流句柄。

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

如果在 bash 中通过管道传输,使用 subprocess 和 xclip 的 Python 脚本会挂起 的相关文章

随机推荐

  • jQuery 如果宽度等于百分比

    我知道以像素为单位你可以做这种事情 但如果使用百分比 则不会返回任何内容 如果我的 CSS 使用百分比 我该如何处理 我基本上需要查看具有特定值的 div 然后触发脚本的变体 jQuery if modPopUp css width 32
  • 使用 DirectX 或 OpenGL 显示 100 个浮动立方体

    我想使用显示 100 个浮动立方体DirectX or OpenGL 我正在寻找一些示例源代码或该技术的描述 我无法正确显示多个立方体 我在网上搜索了一系列很好的教程 尽管他们谈论了如何做3D基元 我找不到有关如何进行大量操作的信息3D原语
  • 如何为 VB.net 程序创建启动屏幕

    如何为 vb net 程序创建启动屏幕 我想制作一个在程序开始之前和结束之后出现的视觉效果 这可能吗 打开你的 vb net 添加新项目 转到表单的属性 清除文本 Set the 表单边框样式没有 插入背景图像 将背景图像设置为拉伸 Add
  • 如何删除xlwings中的列?

    我在用着xlwings在 Windows 上 带有 Python 2 7 的 Excel 2007 并且想要使用以下命令删除范围或列xlwings 据我所知 删除范围或列是一个缺失的功能 所以我尝试按照给出的说明进行操作here http
  • 隐式本地化和嵌入资源

    我们可以在使用嵌入资源文件 resx 的同时在 asp net meta resourcekey 中使用隐式本地化吗 如果 app localresouces 中的资源设置为 内容 则一切正常 但如果将其设置为 嵌入 则无法使其工作 使用隐
  • Android:如何以编程方式使活动窗口半透明?

    有没有办法以编程方式使活动窗口显示为半透明 出于我的目的 我无法使用静态 XML 资源 我尝试将背景资源设置为半透明颜色 但这只会使背景显示为纯黑色 把它写在你的活动课上 Window window this getWindow windo
  • 如何管理需要AsyncTask调用的不同任务

    我有一个外部库可以使用 它通过互联网与服务器进行通信 每当我需要从互联网获取一些信息时 Android 都会强制我使用异步任务 到目前为止没有问题 但是 我收到越来越多的任务来从互联网检索 以不同方式 数据 并且我不喜欢为每个调用增加不同的
  • 为什么我的 Julia 代码运行速度比 JavaScript 慢?

    最近 我对 Julia lang 很感兴趣 因为它声称是一种具有接近 C 性能的动态语言 然而 到目前为止我的经验并不好 至少在性能方面 我正在编写的应用程序需要随机访问特定的数组索引 然后将它们的值与其他特定的数组索引进行比较 经过多次迭
  • 返回 AJAX 调用数据的 JavaScript 函数 [重复]

    这个问题在这里已经有答案了 我想创建一个 JavaScript 函数 它返回 jQuery AJAX 调用的值 我想要这样的东西 function checkUserIdExists userid return ajax url theur
  • Spring 属性占位符不起作用

    我在 stackoverflow com 上读过类似的问题 但没有一个解决方案对我有帮助 我使用的配置如下 maven项目结构 这src main resources properties app properties file possi
  • angular.js 控制器作为使用 $template 缓存服务的语法模板绑定

    我之前已经使用过 Angular JS 但现在我在 Angular JS 中使用控制器作为语法 并且无法绑定模板 我的控制器代码 function angular module vkApp controller Feeds Feeds fu
  • 支持语音的 ASP.NET 应用程序

    我们正在开发一个 ASP NET Web 应用程序 该应用程序需要通过语音输入一些数据 用户可以使用普通用户界面输入一些数据 但是 我们需要一个附加功能 让他可以通过语音输入数据 我们可以修复语音命令 例如输入 value1 到 data1
  • Jooq、Spring 和 BoneCP 连接关闭两次错误

    我正在将 Spring 4 0 0 以及 jOOQ 3 2 0 和 BoneCP 0 8 0 用于 Web 应用程序 我的 PersistenceContext 配置与本指南相同 请浏览一下 代码有点太多 无法粘贴到此处 http www
  • 无法找到资源 ID - Android Gradle 插件 3.4.0

    当从多模块项目中的 Android Gradle Plugin 3 3 2 迁移到 3 4 0 并执行时connectedAndroidTest我看到一个致命的异常 Google Play 服务共享类StringResourceValueR
  • 循环遍历datagridview

    我的是一个Windows应用程序 包含名为 BOM 和 BOMSelected 的表单 BOM中有一个datagridview 其中包含checkbox列 当用户选择checkbox时 所选行应该在其他形式的datagridview中看到
  • 如何在 Laravel 5.5 中进行迁移?

    我创建了一个 Auth 项目拉拉维尔 5 5并创建了新的迁移 当我迁移时 我收到此错误消息 在 Connection php 第 647 行 SQLSTATE 42S01 Base table or view already exists
  • 安装 apk 文件时出现错误“软件包似乎已损坏”

    我遇到了一个奇怪的问题 将 Android Studio 从 2 3 3 更新到 3 0 后 我收到此错误 问题是当我尝试安装 apk 文件时 它说 应用程序未安装 该软件包似乎已损坏 我尝试过在调试版本和发布版本中生成 apk 并尝试安装
  • 有未提交的工作待处理。请在调用前提交或回滚

    我有一个批处理课程 public class BatchCreateGCalendars implements Database Batchable
  • 如何在Java中使用TLSV1或SSLV3进行第一次握手(Client Hello)?

    当我执行以下代码时 为什么第一次握手是SSLv2 而不是TLSv1或SSLv3 如何在Java中使用TLSV1或SSLV3进行第一次握手 String host www google com String url adsense sourc
  • 如果在 bash 中通过管道传输,使用 subprocess 和 xclip 的 Python 脚本会挂起

    我有一个 python 脚本 需要将一些值输出到 stdin 并将另一个字符串复制到剪贴板 我正在使用该模块subprocess执行xclip效用通过Popen像这样的东西 clip py import subprocess from su