如何在Sikuli的后台运行批处理文件?

时间:2013-05-15 06:41:53

标签: python batch-file sikuli

如何在Sikuli的后台运行批处理文件?

环境:WinXP,Python 2.7,Sikuli r930。

假设我有一个简单的批处理文件 startNotepad.bat ,其中包含1行:

START notepad

我使用Python脚本中的 os.system 方法启动批处理文件:

import os
os.system("startNotepad.bat")
os.system("d:\\newDir\\startNotepad.bat")
print("hello notepad")#displayed while 2 instances of notepad are running

当我从Python脚本启动时,它表现得像我想要的那样 - 记事本窗口在后台打开,Python脚本在调用批处理文件后继续。我也在Sikuli脚本中使用 os.system 启动批处理文件,这就麻烦了。 Sikuli脚本看起来像这样:

import os
os.system("d:\\newDir\\startNotepad.bat")
print("hello notepad")#displayed only after notepad is closed

当我从Sikuli IDE启动它时会出现错误:

[info] Sikuli vision engine loaded.
[info] Windows utilities loaded.
[info] VDictProxy loaded.
[error] Stopped
[error] Linia 2 zawiera blad
[error] Informacja o bledzie: Traceback (most recent call last):
 File "C:\DOCUME~1\*********\LOCALS~1\Temp\sikuli-tmp2989271839024887193.py", line 2, in 
 os.system("d:\\newDir\\startNotepad.bat")
 File "C:\Program Files\Sikuli X\sikuli-script.jar\Lib\subprocess.py", line 456, in call
File "C:\Program Files\Sikuli X\sikuli-script.jar\Lib\subprocess.py", line 751, in __init__
 File "C:\Program Files\Sikuli X\sikuli-script.jar\Lib\subprocess.py", line 1236, in _execute_child
TypeError: unsupported operand type(s) for +: 'NoneType' and 'list'

好吧,这不是什么大问题,因为我还是使用可执行的Sikuli脚本。但是,如果是非gui模式,它的行为并不像预期的那样 - Sikuli脚本等待记事本关闭

为什么 os.system 在纯Python和Sikuli的情况下工作方式不同?我想这是因为Sikuli有自己的Python解释器。行为可以以某种方式配置?那有什么解决方法吗?

2 个答案:

答案 0 :(得分:1)

行为与python不同,因为Sikuli的运行时是Java。 Sikuli使用Jython,jython是使用python语法编写的Java。

根据os.system(命令)的文档,它阻止从生成的子shell返回返回代码。 (http://docs.python.org/2/library/os.html#os.system

在python和Java中,默认的shell状态可能不同,一个在shell命令完成时返回,另一个等待所有句柄关闭。

理想情况下,您需要的是非阻塞子流程。

你可以使用pythons subprocess.popen或者Sikuli的App.open()来实现这个

答案 1 :(得分:1)

对于2013年之后的读者来说,Sikuli现在附带了一个命令run。阅读文档here