【问题标题】:How to run a batch file in background from Sikuli?如何从 Sikuli 在后台运行批处理文件?
【发布时间】:2014-12-09 00:37:17
【问题描述】:

如何从 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 解释器。可以以某种方式配置行为吗?有什么解决方法吗?

【问题讨论】:

  • Sikuli 使用 Jython,而不是 Python,因此您应该使用它进行测试。但我不认为这是问题所在。你能看看sikuli-tmp文件,看看里面的内容是否有用吗?
  • 您不想通过 Sikuli 脚本启动记事本的任何原因。例如App("notepad.exe").open()?你可能想看看subprocess.callsubprocess.Popen [jython.org/docs/library/subprocess.html]
  • @blotto: App("somePath\\someBatch.bat").open() 有效。谢谢你。现在很容易。我认为这是使用Sikuli内置方法的最佳方式。
  • @Nathaniel Waisbrot:是的,Python 和 Jython 的差异可能导致了这种情况。我在环境中的任何地方都找不到 sikuli-tmp 文件。

标签: python batch-file sikuli


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    对于 2013 年之后的读者,Sikuli 现在附带了一个命令run,它正是这样做的。阅读文档here

    【讨论】:

      猜你喜欢
      • 2018-07-08
      • 2021-07-05
      • 2012-09-29
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多