简单地演示一下如何在Godot中调用Python解释器来执行指定的代码字符串和Python文件。
首先,我们创建一个Godot项目,自己指定名称和路径,剩下的配置默认即可。
添加"Node"节点后将其重名为"Main",添加一个Timer作为子节点后并保存当前场景。
这里将Timer的AutoStart和One Shot都勾选,并将Wait Time设置为2s,
该Timer用作自动退出程序的计时器。
在Main节点上添加脚本并打开,我这里用VS Code作为脚本编辑器。
在你想要创建虚拟环境的Python解释器目录下打开CMD,
使用"python.exe -m venv path/to/your/virtualenv"指令来在指定路径下创建虚拟环境,
我这里的路径是"E:\aardio\Godot\venv"。
一切顺利的话你的Godot项目的目录结构应该如下图所示。
进入venv文件夹下的Scripts文件夹中,复制python.exe即python解释器的绝对路径,
我这里的路径是"E:\aardio\Godot\venv\Scripts\python.exe",
用变量将其保存并将转义字符"\"替换成"/"。
写一个用来退出程序窗口的信号函数"on_timer_timeout",并在_ready函数中用Timer进行连接。
在终端中使用"pip install pyautogui"安装PyAutoGUI库,
注意要先用activate.bat或Activate.ps1先激活下环境,
用哪个激活取决于你用的终端是CMD还是PowerShell。
安装成功后在Godot项目的根目录下创建一个名为"main.py"的脚本文件,
写入如下所示的代码,
运行测试一下,如果正常的话鼠标会移动到屏幕左上角原点。
import pyautogui
def main():
pyautogui.moveTo(0, 0)
if __name__ == '__main__':
main()
回到Godot脚本文件中,同之前的操作一样,用变量保存"main.py"文件的路径,
重点来了,这里我们先调用Python解释器来执行指定的Python文件。
如果对OS.create_process函数不太了解的话请看官方文档。
在Godot编辑器中选择并运行main场景,正常的话窗口会自动在2秒钟后关闭,
同时在Output一栏会打印pid的信息,即刚才调用Python解释器执行Python文件的进程ID。
你还可以顺手测试一下该进程是否执行完成后自动退出。
接下来我们看如何用指定的Python解释器执行代码字符串:
首先我们在Main节点下再添加一个Timer Node,重命名为"RunCodeStrTimer"。
将原先的Timer节点的Wait Time设置为4s。
将两个Timer节点都设置为"Access as Unique Name"。
如果成功的话节点后面会出现"%"符号。
回到脚本文件,在_ready函数中修改并添加成如下代码。
然后我们定义on_run_code_str_time这个信号函数。
为了方便对比这里我写了四段Python代码字符串,
分别用到PyAutoGUI库、time库、DXcam库和pywin32库,如需测试请自行安装。
注意Python代码字符串里面一定要用"\r"来表示换行操作,
单纯的回车在代码作为字符串传递后不会生效,进而导致所有代码失效。
第二段代码也就是time_str执行的话需要把OS.create_process函数的最后一个参数由false改为true,以便显示执行命令的终端窗口。
func on_run_code_str_time():
var pyautogui_str = "
\rimport pyautogui
\rpyautogui.moveTo(0, 0)
"
var time_str = "
\rimport time
\rdef main():
\r print(time.time())
\r
\rif __name__ == '__main__':
\r main()
\r input('')"
var dxcam_str = "
\rimport dxcam
\rdxcam = dxcam.create()
\rframe = dxcam.grab()
\rfrom PIL import Image
\rImage.fromarray(frame).show()
\rinput('')
"
var pywin32_click_str = "
\rimport win32api
\rimport win32con
\rimport time
\r
\rwin32api.SetCursorPos((0, 0))
\r
\rdef click(x, y):
\r # 移动鼠标到指定坐标
\r win32api.SetCursorPos((x, y))
\r
\r # 模拟鼠标左键按下和弹起
\r win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
\r time.sleep(0.3) # 等待一段时间,可以根据需要调整
\r win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
\r
\rclick(30, 50)
"
# 调用指定路径下的Python解释器执行代码字符串
var pid2 = OS.create_process(python_interpreter_path, ["-c", pyautogui_str], false)
if pid2 != -1:
print("pid2 = ", pid2)
当然你也可以简单地只用我们之前已经安装好的PyAutoGUI库来进行测试。
如果鼠标不能正常移动到屏幕左上角的话可以尝试重启Godot编辑器。
至此,我们已经简单了解了如何在Godot中调用Python解释器来执行指定的文件和代码字符串。