小编mgl*_*art的帖子

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

我有一个 python 脚本,需要将一些值输出到 stdin 并将另一个字符串复制到剪贴板。我正在使用该模块通过如下方式subprocess执行实用程序:xclipPopen

# 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()))
Run Code Online (Sandbox Code Playgroud)

该脚本按预期工作:PRINT_ME在 bash 中回显PASTE_ME并可粘贴,并立即返回。

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

$ python clip.py|tee file.txt
Run Code Online (Sandbox Code Playgroud)

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

如何解决这个问题?

一些重要信息xclip实用程序分叉自身(以应对 X 上剪贴板的实现)维护可复制的字符串,在 shell 中使用时它立即返回(它分叉到后台)。看来 shell 正在将clip.pystdin xclip/stdout 附加到tee.
如果xclip -selection clipboard发现正在使用ps u并杀死该命令,则返回。

我正在使用Python 3.4。
谢谢

python shell subprocess piping xclip

5
推荐指数
1
解决办法
1450
查看次数

标签 统计

piping ×1

python ×1

shell ×1

subprocess ×1

xclip ×1