我正在尝试编写一个能够与其他程序交互的python程序。这意味着发送标准输入和接收标准输出数据。我不能使用pexpect(尽管它确实启发了一些设计)。我现在使用的过程是这样的:将pty附加到子进程的标准输出循环直到子进程通过检查subprocess.poll退出当标准输出中有可用数据时,立即将该数据写入当前标准输出。完成!我一直在制作一些代码(如下)的原型(prototype),这些代码可以工作,但似乎有一个缺陷困扰着我。子进程完成后,如果我在使用select.select时未指定超时,则父进程会挂起。我真的不想设置超时。只是看起来有点脏。但是,我尝试解决该问题的所有其他方法似乎都不起
http://docs.python.org/library/pty.html说——pty.fork()¶Fork.Connectthechild’scontrollingterminaltoapseudo-terminal.Returnvalueis(pid,fd).Notethatthechildgetspid0,andthefdisinvalid.Theparent’sreturnvalueisthepidofthechild,andfdisafiledescriptorconnectedtothechild’scontrollingterminal(andalsotothech
我正在尝试创建一个将在服务器上远程执行的执行环境/shell,它通过套接字流式传输stdout、err、in以在浏览器中呈现。我目前已经尝试过将subprocess.run与PIPE一起使用的方法。问题是我在进程完成后得到标准输出。我想要实现的是获得逐行、伪终端类型的实现。我目前的实现test.pydefgreeter():for_inrange(10):print('helloworld')greeter()在shell中>>>importsubprocess>>>result=subprocess.run(['python3','test.py'],stdout=subproces
在CentOS6.5中,yuminstallzssh,执行zssh时,报错:outofpty's。这是什么意思?如何解决? 最佳答案 你可以看到使用过的ptys列表ls/dev/ptsptys的最大数量由下式给出cat/proc/sys/kernel/pty/max该值可以在中配置/etc/sysctl.conf(参见manpty)请注意,某些内核版本为buggy.ptys,或pseudoterminals是进程与用户控制台(键盘和屏幕)交互的“channel” 关于linux-zssh
我正在尝试通过PTY模块管理与网络设备的SSH连接,代码类似于:cmd_line="sshcoltrane@love.supreme.com"beginPTY.spawn(cmd_line)do|r_f,w_f,pid|...rescuePTY::ChildExited=>cended...end整个I/O工作得很好,但是我不知道如何获取子进程的退出状态。例如,如果连接断开或只是超时,生成的进程将终止并显示错误代码,但此代码似乎不会在$?特殊变量中返回。 最佳答案 长见识使用1.9.2并等待PTY进程正确设置$?PTY.spawn(
从串行设备(/dev/ttyXX)读取多个进程使得两个进程无法获取所有数据——数据将以某种方式在它们之间拆分。我想编写一个从串行设备读取的程序,创建几个主/从pty对,然后允许从串行设备读取的程序改为从ptys读取,以便所有读取进程接收数据从串行设备读取,并让pty像串行设备一样工作,因为当它们开始从pty读取数据时,它们只获得最新的数据。换句话说,您不会获得在开始读取之前写入的任何数据(根据我的经验,这就是/dev/ttyXX设备的工作方式,或者至少是我正在读取的RS-232风速计)。命名管道可以通过捕获SIGPIPE来模拟这些语义以确定没有读者,因此我们可以选择不写入那个特定的命名
在ruby脚本中,我启动了多个虚拟shell,每个都由一个shell管理器对象管理,如下所示:@shell=PTY.spawn'envPS1="\w>"TERM=dumbCOLUMNS=63LINES=21sh-i'在稍后的某个时间点,我想销毁这个实例并终止相关的shell进程。可悲的是,我无法正常工作。这是我尝试过的方法,按照工作的可能性排序:没有,也就是说,期望在管理对象被销毁时关闭shellproc。使用kill命令杀死shell上运行的所有进程(这有效),然后使用system("kill#{@shell[2]")杀死shell本身。这没有效果。在上面使用-9。这会使shel
我正在尝试编写一个Ruby脚本,它将通过ssh连接到服务器,运行给定的命令,并从中获取输出。这是我目前所掌握的,大部分改编自ProgrammingRuby书:require'pty'require'expect'$expect_verbose=truePTY.spawn("sshroot@x.y")do|reader,writer,pid|reader.expect(/root@x.y'spassword:.*/)writer.puts("password")reader.expect(/.*/)writer.puts("ls-l")reader.expect(/.*/)answer=
问题因此,您希望(分别)记录一个进程或子进程的stdout和stderr,如果您没有记录任何内容,则输出不会与您在终端中看到的不同。看起来很简单,不是吗?不幸的是,似乎不可能为这个问题编写一个适用于任何给定进程的通用解决方案......背景管道重定向是分离标准输出和标准错误的一种方法,允许您单独记录它们。不幸的是,如果您将stdout/err更改为管道,则该进程可能会检测到该管道不是tty(因为它没有宽度/高度、波特率等)并可能相应地改变其行为。为什么要改变行为?好吧,一些开发人员会使用终端的功能,如果您正在写入文件,这些功能就没有意义。例如,加载条通常需要将终端光标移回行首,并用新长
问题因此,您希望(分别)记录一个进程或子进程的stdout和stderr,如果您没有记录任何内容,则输出不会与您在终端中看到的不同。看起来很简单,不是吗?不幸的是,似乎不可能为这个问题编写一个适用于任何给定进程的通用解决方案......背景管道重定向是分离标准输出和标准错误的一种方法,允许您单独记录它们。不幸的是,如果您将stdout/err更改为管道,则该进程可能会检测到该管道不是tty(因为它没有宽度/高度、波特率等)并可能相应地改变其行为。为什么要改变行为?好吧,一些开发人员会使用终端的功能,如果您正在写入文件,这些功能就没有意义。例如,加载条通常需要将终端光标移回行首,并用新长