2013-05-15 159 views
2

如何在Sikuli的背景下運行批處理文件?如何在Sikuli的背景下運行批處理文件?

環境:WinXP,Python 2.7,Sikuli r930。

假設我有一個簡單的批處理文件startNotepad.bat其中包含1號線:

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

START notepad 

我使用使用os.system從Python腳本方法啓動批處理文件

當我從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解釋器。行爲可以以某種方式配置?有沒有解決方法?

+1

Sikuli使用Jython,而不是Python,因此您應該使用它進行測試。但我不認爲這是問題。你可以看看'sikuli-tmp'文件,看看那裏的內容是否有幫助? –

+1

你不想通過Sikuli腳本啓動記事本的任何原因。例如'App(「notepad.exe」)。open()'?你可能想看看'subprocess.call'或'subprocess.Popen' [http://www.jython.org/docs/library/subprocess.html] – blotto

+0

@ blotto: App(「somePath \\ someBatch.bat 「).open()的作品。謝謝。現在很容易。我認爲這是使用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命令完成時另一個返回,另一個等待所有句柄關閉。

理想情況下,你想要的是一個非阻塞子進程。

您可以使用乙醚蟒蛇subprocess.popen或Sikuli的App.open()2013年後實現這一

1

對於讀者來說,Sikuli現在來與不正是這樣的命令run。閱讀文檔here