gpt4 book ai didi

python - 获取返回管道输入的命令运行

转载 作者:太空宇宙 更新时间:2023-11-03 11:47:13 24 4
gpt4 key购买 nike

我将这段 Python 3 代码存储在 pipe.py 中,它接受一些管道输入并逐行打印:

import sys

for i, line in enumerate(sys.stdin):
print("{}: {}".format(i, line))

然后我可以在 Bash 中运行它:

$ echo "Test" | python pipe.py
0: Test

这是按预期工作的,但我感兴趣的是是否有办法实际运行导致管道输入的命令。因此,对于我上面的示例,值 Test 已通过管道传输到程序中,但执行了 echo "Test" 以获得该值。

有没有办法在我的 Python 程序中将 echo "Test" 命令作为字符串获取?

最佳答案

这是可能的——至少在 Linux 上,当你有 /proc 文件系统时, 如果 a) 你的标准输入是一个管道 b) 管道发送者还没有消失。

想法是检查/proc 文件系统中的相应管道条目:

  • 您的 Python 脚本将管道连接到标准输入(文件描述符 0)。
  • 管道的另一端连接到发送进程的标准输出文件描述符 (1)。

例如,假设您的 Python 脚本的进程 ID 为 1001 并且发送者的 pid 为 1000,这就是您将看到的:

$ ls -l /proc/1001/fd/0
lr-x------ 1 user users 64 Sep 22 14:41 /proc/1001/fd/0 -> 'pipe:[507536]'

$ ls -l /proc/1000/fd/1
l-wx------ 1 user users 64 Sep 22 14:41 /proc/1000/fd/1 -> 'pipe:[507536]'

所以在 /proc 中稍微搜索一下,你就可以得到你想要的。 这是一个用 bash 做的例子 -- 输出是

$ yes 1 2  | ./find-piper.sh 
sender pid is 21380, command is "yes 1 2 "

find-piper.sh 脚本如下所示:

#!/bin/bash

myPid=$$

# determine pipe connected to stdin:
myPipeNumber=$( readlink /proc/$myPid/fd/0 | sed -n 's,^pipe:\[\([0-9]\+\)\]$,\1,;T;p' )
if [[ -z $myPipeNumber ]] ; then
echo "input is not a pipe"
else
# find process with stdout connected to our pipe
senderPipe=$( find /proc -mindepth 3 -maxdepth 3 -path "*/fd/1" -lname "pipe:\[$myPipeNumber\]" 2>/dev/null )
senderPid=$( sed -n 's,/proc/\([0-9]\+\)/.*,\1,;T;p' <<< "$senderPipe" )

# report pid and command line of sender
if [[ -z $senderPid ]] ; then
echo "could not find sender pid"
else
echo "sender pid is $senderPid, command is \"$( tr '\000' ' ' </proc/$senderPid/cmdline )\""
fi
fi

# eat input
cat > /dev/null

转换为 Python 留作练习:)

注意事项:

  • 但是,第二个先决条件(“管道发送者尚未离开”)不会在您的情况下给出,因为 echo "Test" 将完成得非常快。
  • 如果您的发送器管道包含多个命令(例如,(echo "Test"; sleep 2) | python pipe.py),那么您会发现多个发送器条目。

关于python - 获取返回管道输入的命令运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36360109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com