Python使用管道处理输入/输出 我编写一个C++程序,将Python 3解释器作为子进程运行,然后连接两个Linux匿名管道——一个到它的代码> STDUD/和 STDRR < /C> >第二个到解释器>代码> STDIN < /C>接下来,通过这些通道与it进行通信

Python使用管道处理输入/输出 我编写一个C++程序,将Python 3解释器作为子进程运行,然后连接两个Linux匿名管道——一个到它的代码> STDUD/和 STDRR < /C> >第二个到解释器>代码> STDIN < /C>接下来,通过这些通道与it进行通信,python,linux,pipe,ipc,Python,Linux,Pipe,Ipc,我需要在交互模式下运行Python,即使用输入管道向它传递一个命令,然后在输出管道上等待答案。一切都会很好,但Python似乎只有在stdout和stdin连接到tty时才能运行交互模式 Python文档报价: 解释器的操作有点像unixshell:当使用连接到tty设备的标准输入调用时,它以交互方式读取和执行命令;当使用文件名参数或文件作为标准输入调用时,它从该文件读取并执行脚本 事实上,当我用管道而不是tty运行解释器时,在发送命令后,我在响应管道中看不到任何东西 所以-我可以通过某种方式绕

我需要在交互模式下运行Python,即使用输入管道向它传递一个命令,然后在输出管道上等待答案。一切都会很好,但Python似乎只有在
stdout
stdin
连接到tty时才能运行交互模式

Python文档报价:

解释器的操作有点像unixshell:当使用连接到tty设备的标准输入调用时,它以交互方式读取和执行命令;当使用文件名参数或文件作为标准输入调用时,它从该文件读取并执行脚本

事实上,当我用管道而不是tty运行解释器时,在发送命令后,我在响应管道中看不到任何东西

所以-我可以通过某种方式绕过这种行为,让python3解释器完全按照用户从终端开始的方式工作吗

简而言之,问题在于:

我需要将Python集成到我的C++服务器应用程序中,以允许客户端执行Python命令。 将解释器嵌入服务器看起来是个坏主意,主要是出于安全考虑(用户可能会损坏服务器或其数据,而且服务器正在运行,我不想授予用户一些特权)

另一种可能的解决方案是以CLI方式(命令模式)使用解释器。主要问题是-然后我需要导入一些模块并预执行一些代码,以向用户提供我的服务器环境和一些API。在用每个命令调用解释器之前,这将是非常繁重的(这些操作相当复杂,包括建立网络连接)

所以,在一个单独的进程中运行解释器,服务器使用IPC机制与解释器进行通信似乎不是什么坏主意


无论如何,如果您有任何建议,我很乐意看看您的建议。

您可以以cli方式使用python,每次运行用户输入的命令,或者将它们归档到文件中并按输入的行运行。通过这种方式,您可以更简单地使用它的输出。希望有用。

您可以以cli方式使用python,每次运行用户输入的命令,或者将它们归档到文件中并按输入的行运行。通过这种方式,您可以更简单地使用它的输出。希望有用。

如果您真的需要子进程认为它正在与终端通信,您可以使用伪终端或pty来实现这一点。有两种不同的API,一种来自BSD Unix,另一种来自System V,Linux支持这两种API。请参阅或查看
forkpty
posix\u openpt
的手册页


然而,在本例中,我猜测python解释器正在对其输出进行块缓冲。您可以通过使用
-u
调用它来测试这一点,以禁用stdin/stdout上的缓冲。

如果您确实需要子进程认为它正在与终端通信,您可以使用伪终端或pty来实现这一点。有两种不同的API,一种来自BSD Unix,另一种来自System V,Linux支持这两种API。请参阅或查看
forkpty
posix\u openpt
的手册页


然而,在本例中,我猜测python解释器正在对其输出进行块缓冲。您可以通过使用
-u
调用它来测试这一点,以禁用stdin/stdout上的缓冲。

您正在做一些非常奇怪和不寻常的事情。交互式shell用于交互式使用,具有人工键入命令的功能。它不是为交互式脚本设计的,因为输入来自另一个程序

话虽如此,是的,你可以这样做,尽管我真的不推荐这样做。您要做的是运行一个脚本,读取命令的stdin,然后调用exec()方法

简单的版本可能如下所示:

while True:
    lines = []
    while True:
        line = input()
        if line == "":
            exec("\n".join(lines))
            break
        else:
            lines.append(line)
当接收多行输入时,上述程序的行为类似于python shell,因为交互命令会被缓冲,直到有连续的空换行符时才会执行

对于脚本/编程用法,您可能需要一个比双换行更健壮的块标记。例如,您可能希望改为使用空字符中断命令块,以便可以安全地执行包含空行的脚本


FWIW,我同意这看起来是个错误的问题。有可能比这样做更好更容易解决实际问题。你真正想做的是什么?

你正在做一些非常奇怪和不寻常的事情。交互式shell用于交互式使用,具有人工键入命令的功能。它不是为交互式脚本设计的,因为输入来自另一个程序

话虽如此,是的,你可以这样做,尽管我真的不推荐这样做。您要做的是运行一个脚本,读取命令的stdin,然后调用exec()方法

简单的版本可能如下所示:

while True:
    lines = []
    while True:
        line = input()
        if line == "":
            exec("\n".join(lines))
            break
        else:
            lines.append(line)
当接收多行输入时,上述程序的行为类似于python shell,因为交互命令会被缓冲,直到有连续的空换行符时才会执行

对于脚本/编程用法,您可能需要一个比双换行更健壮的块标记。例如,您可能希望改为使用空字符中断命令块,以便可以安全地执行包含空行的脚本


FWIW,我同意这看起来是个错误的问题。有可能比这样做更好更容易解决实际问题。您真正想做的是什么?

为什么需要Python以交互方式运行?你不能仅仅使用
python-c
以非交互方式运行代码段吗?@JohnKugelman只需要预导入som即可