0

我正在尝试编写一个启动子进程并写入子进程标准输入的 python 脚本。对输出进行一些测试,然后将更多命令写入标准输入。

我试过了:

def get_band():
    print "band" 
    p = subprocess.Popen(["/path/to/program","-c","-"], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)

    ran_stdout = p.communicate(input='show status')[0]
    print(ran_stdout)

但是打印语句给出:

Unable to connect at 127.0.0.1, Connection refused. 

我想知道我这样做是否正确?这是有关我尝试运行的过程的文档。我想使用最后一个选项。

Running the tool from the Linux shell allows additional options, depending on the options given to the command. The options are as follows:

-h Displays help about the command

-c <Filename>  Instead of taking typed commands interactively from a user the commands are read from the named file, i.e. in batch mode. When all commands are processed the CLI session ends automatically.

-c - As above but reads command from Linux stdin. This allows commands to be ‘piped’ to the program.
4

2 回答 2

1

如果你能告诉我们更多关于那个程序的信息,也许知道这个程序的人可以试着更好地解释它具体是如何工作的。

不过,你所描述的

启动一个子进程,并写入子进程标准输入。对输出进行一些测试,然后将更多命令写入标准输入。

与您的代码不匹配。

您的代码将某些内容打印到我们自己的标准输出、显示band,然后与子进程进行“一次性”通信。

为了清楚这一点,p.communicate()将它获得的所有内容写入子进程,关闭其标准输入并读出它从标准输出和标准错误中获得的任何内容。

因此,它与您的愿望不相容:写,读,再写。

所以你必须自己制作。

如果您编写的块足够小以保证适合管道缓冲区,那很简单:只需编写命令(不要忘记尾随\n)并读取。

但请注意!不要阅读比你真正拥有的更多,否则你的阅读可能会阻塞。

因此,使用非阻塞 IO 或select.select().

如果您需要有关其中一个或另一个的更多信息,这里还有其他关于 SO 的答案,涵盖了这些主题。前几天我写了一篇可能对你有帮助的文章。

于 2013-04-09T16:43:40.217 回答
0

这出于某种原因,在同一行中传递了命令。然后为我想要的每个命令调用此函数。

  p = subprocess.Popen(["/path/to/program", '-c', '-', cmd_here],
  stdout=subprocess.PIPE) 
  proc_stdout, proc_stderr = proc.communicate()
  proc.wait()
  #print stuff
于 2013-04-10T10:50:46.390 回答