2017-01-20 52 views
-1

我有一个问题,但它很难对我解释:Python的 - 通过控制台命令到第三方控制台应用程序

我有一个应用程序(我们称之为ABC),有他们自己的控制台 - 这soncole通过CMD运行是这样的:在同一个窗口 abc console console.xml ABC控制台启动,而是C:\>,我只得到> - 剩下的就是像CMD。

我知道,我可以运行CMD命令,即是这样的:

self.full_path = 'dir /b' 
self.pipe = check_output(self.full_path, shell=True, universal_newlines=True).strip() 

但是,当我尝试这样做:

self.full_path = 'abc console console.xml' 
self.pipe = check_output(self.full_path, shell=True, universal_newlines=True).strip() 

什么事都没有发生,控制台冻结。我试着添加一些命令,检查是否尽管“冻结”我可以做一些事情,比如导出一些XML,但没有任何事情发生。

是否有任何的方式来传递任何命令为abc?

+1

你应该弄清楚如何应用程序从用户获得他们的命令。这究竟意味着它有“自己的控制台”?你是否以问答形式谈论它?还是它提供了一个基于字符的界面,即把东西放在控制台的某些字符单元位置,线条编辑,格式化和类似的东西?你的问题中的示例代码也应该调用'abc',然后调用'dir'。描述你在做什么时遇到的问题。理想情况下,你还应该修复拼写:http://stackoverflow.com/help/how-to-ask – blubberdiblub

+0

嗨,请在第一篇文章中找到更多细节 – Fangir

回答

1

如果你的应用是足够简单,它很可能会接受通过它的标准输入命令。如果直接在shell中运行它,它将直接从您自己提供的输入中获得标准输入(除非使用重定向)。

但是,如果你运行它从另一个Python程序的子进程,并要自动的输入,你要告诉你的Python代码到输入馈入应用程序的标准输入通道。

有几个方法可以做到这与subprocess模块。假设你要提供一个或一组只有一次命令你的应用程序,而无需对后来输出反应,定时敏感的动作或用户交互,你的确可以使用check_output()

import subprocess 

external_command = 'abc console console.xml' 
pass_command = 'twiddle knob\n' 

output = subprocess.check_output(external_command, shell=True, 
           universal_newlines=True, 
           input=pass_command) 

注意,你传递一个字符串到input参数,该参数包括您想要一次发送的所有命令,由换行符(因此为\n)分隔。

您可以从命令列表构建一个字符串,如果你想:pass_command = '\n'.join(command_list) + '\n'

如果您需要喂养输入到你的应用更灵活的方式,你可以使用stdin=参数,而不是和它传递一个文件对象或文件描述符。或者宁可使用Popen()来获得更灵活的界面。

另请注意,check_output()不会返回管道,而是返回所有输出的字符串。因此,您需要确保您的应用程序自行结束(或通过发送一条使其退出的命令),否则check_output()将永远等待。如果您不能或不想立即退出,则需要使用更灵活的接口并根据需要进行写入/读取。

+0

说实话,我已经尝试了几种不同的方法,我无法弄清楚。 'self.start_abc = Popen(self.run_abc,shell = True,cwd = self.full_path,universal_newlines = True,stdin = self.command_to_abc)''。我已经添加了'cwd',因为我只能从特定的目录启动abc。在'self.command_to_abc'中有简单的commad,返回文件输出 - 这个文件没有创建,所以整体不起作用 – Fangir

+0

@Fangir当你说“这个文件没有被创建”时,你指的是什么文件?外部程序的输出不是输出到它的标准输出(通常不是文件)吗? – blubberdiblub

+0

我试过测试,把命令传递给abc控制台,生成xml文件。文件没有创建,另外,我已经运行CMD的程序,这是输出:'AttributeError:'str'object has no attribute'fileno'' – Fangir

1

感谢Blubberdiblub,我能做出这样的:

print("\nStarting ABC console") 
    self.pass_start = Popen(self.run_abc, shell=True, cwd=self.full_path, stdin=PIPE, universal_newlines=True) 
    sleep(20) #becouse consol starts about 15 seconds 

    print("\nExport application") 
    self.pass_start.stdin.write(self.export_app) 
    sleep(2) 

    self.pass_start.kill() 

Mayby它不是完美的,更高级的用户可以做的更好,但这种方式我能够打开ABC控制台,并通过那里几个命令,比关闭这个控制台。

+1

请注意,'write()'方法只返回写入的字符数。所以如果你不需要这个值,你可以省略'self.export_application ='部分。 – blubberdiblub

+0

没有想到 - 更少量的代码(编辑版本以上) - 谢谢! – Fangir