使用PIPE打开的子过程仍在读取端子的输入

问题描述 投票:0回答:1

Python应用

我的Python 3.6.8应用在CentOS 7.6上运行,并且:

  • 使用Kivy 11.1.1提供GUI。
  • 从其他人打开子流程。
  • 子进程提供了一个自定义外壳。
  • 当用如下所示的管道打开时,子过程仍然从终端读取。
  • 它忽略了我应用程序的标准输入命令。
  • 但是我的应用程序确实通过管道从子流程接收输出。

子过程

  • 子进程控制设备。
  • 通常提供交互式外壳。
  • 我需要通过我的应用进行控制。
  • 要启动它,我调用一个编译的二进制文件。
  • 它使用一些Perl模块。
  • 我不知道它的工作方式。

Popen命令

我使用此命令从主线程启动子进程:

launch_cmd = "{} {} {} {}".format(path_of_compiled_binary, opt1, opt2, opt3)
self.myproc = subprocess.Popen(launch_cmd.split(), shell=False,
    cwd=self.testing_dir, close_fds=True, stdin=subprocess.PIPE,
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=env,
    bufsize=1, universal_newlines=True, preexec_fn=self.ignore_sigint)

写命令

我尝试给子流程命令提供

cmd = self.generate_cmd()
cmd = cmd + "\n"
bytes_sent = self.myproc.stdin.write(cmd)
self.myproc.stdin.flush()
  • 数字bytes_sent符合预期。
  • 子进程将忽略此输入。
  • 但是如果输入启动我的应用程序的终端,它将执行相同的命令。

文件描述符

  • 如上所述启动时,子进程最终将具有这些文件描述符。
  • 这是我需要它来运行命令的阶段:

`

lr-x------. 1 demo demo 64 Jun  5 10:44 0 -> pipe:[58635]
l-wx------. 1 demo demo 64 Jun  5 10:44 1 -> pipe:[58636]
l-wx------. 1 demo demo 64 Jun  5 10:44 2 -> pipe:[58636]
lr-x------. 1 demo demo 64 Jun  5 10:44 3 -> /dev/null
lr-x------. 1 demo demo 64 Jun  5 10:44 4 -> path_of_compiled_binary
lr-x------. 1 demo demo 64 Jun  5 10:44 5 -> /dev/tty
l-wx------. 1 demo demo 64 Jun  5 10:44 6 -> /dev/tty
lrwx------. 1 demo demo 64 Jun  5 10:44 7 -> socket:[59509]
lrwx------. 1 demo demo 64 Jun  5 10:44 8 -> /dev/ttyACM0
lr-x------. 1 demo demo 64 Jun  5 10:44 9 -> /tmp/par-64656d6f/temp-15579/inc/lib/PDL/IO/Pic.pm
python linux subprocess popen file-descriptor
1个回答
0
投票

从tty而不是stdin读取子过程

© www.soinside.com 2019 - 2024. All rights reserved.