我有一个 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(使用前将#替换为@)