当前位置: 主页 > Python语言

python 脚本引用目录-shell 引用另一个脚本

发布时间:2023-02-13 14:19   浏览次数:次   作者:佚名

为什么在游戏中使用脚本

在一些早期的游戏中,大部分游戏逻辑都是直接写进游戏代码的,比如计算公式、游戏流程等。但随着游戏行业的不断发展,游戏开发本身也越来越复杂,游戏策划需要更多的时间来调整游戏,如果游戏逻辑还是写在代码里,那么游戏的每一次修改都必须通过程序进行,还需要重新编译重启程序, 所以工作效率大大降低。

在游戏中使用脚本正好可以解决上述问题,小到一些计算公式,大到游戏的控制过程可以通过脚本完成,而且目前大多数脚本系统都是解释和执行的,因此它们可以支持运行时的动态修改,从而可以立即看到修改结果, 这非常方便。

如何使用脚本

在游戏中使用脚本有两种主要方法。一种方法是用高级语言(如C++)编写主程序,然后在其中嵌入脚本解释器,在运行时动态执行一些脚本功能;另一种方法是将整个程序编写脚本化,例如,一些泥浆游戏是直接用LPC脚本编写的。

本文主要研究嵌入式脚本的使用,因为目前大多数脚本都无法像VC++那样提供方便的调试环境,如果程序全部用脚本编写,当脚本有几万甚至几十万行时,调试会成为一件非常痛苦的事情。此外,一些非常耗时的代码可以用C++编写以供嵌入式使用,以保持更好的操作效率。

程序从 C++ main( ) 函数开始,然后进入主循环,在某些C++函数中脚本函数将直接调用,在

脚本函数运行过程中,可能会调用C++扩展函数。C++扩展函数有两个主要功能:一个是添加不能直接在脚本中编写的函数,另一个是替换脚本中运行太慢的函数。

此过程的关键点是C++和脚本如何相互调用对方的函数以及它们如何传递参数和结果。一般的解决方案是使用脚本的 API 在程序启动时向脚本注册C++扩展函数,将函数指针传递给脚本系统以供将来调用,并使用脚本系统的 API 调用脚本函数将调用参数压入堆栈,并通过 API 获取运行结果。

Python 脚本简介

目前有很多第三方脚本语言可以直接使用,比如Tcl、Lua等,本文将介绍Python脚本。Python已经存在了十多年,是一种解释性的,面向对象的脚本语言。Python的解释器可以在大多数操作系统上运行,例如Windows,Linux,Solaris,Mac等。

1. 安装和配置

Python 的主页在,最新版本是 2.3.2,本文使用 2.2.2,可以在其首页下载安装包。运行安装程序后,它将在您的计算机上安装 Python 解释器、文档、扩展等。

安装完成后,开始菜单中会有 Python 的图形编辑器(IDLE,但当前版本不支持汉字)、Python 命令行解释器和用户手册。

为了在C++程序中调用 Python 的 API 函数,需要在 VC++ 搜索目录中添加头文件和 lib 路径,头文件路径是本地 Python 安装目录下的包含目录,lib 路径是本地 Python 安装目录下的 libs 目录。这里需要注意的是,安装包只提供 lib 和 dll 的发布版本,如果需要调试运行,必须下载 Python 源码编译 lib 和 dll 的调试版本,源码可以在这里下载。

2. 语法概论

python 引用_python 脚本引用目录_shell 引用另一个脚本

详细的语法说明请参考 Python 安装包自带的文档,这里我只介绍一些常用的关键字和注意事项。

Python 在C++中没有 { 和 },而是使用缩进。变量不需要单独声明,但它们不能引用未赋值的变量。

模块的概念是在Python中引入的,类似于C++中的库概念。模块可以包含函数、变量、类。脚本文件是一个模块,使用前需要导入模块。

Python 中没有开关,请使用 if 判断:

如果 ( 数字==1 ):

打印“1”

埃利夫 ( 数字==2 ):

打印“2”

还:

打印“未知”

而 是 Python 中的一个循环语句。您可以使用继续跳转到 while 循环内的下一个循环,并使用 break 跳出整个循环:

碳纳米 = 5

而 ( CNT > 0 ):

打印碳纳米管

碳纳米管 -= 1

对于循环:列表 = [“测试1”, “测试

python 脚本引用目录_python 引用_shell 引用另一个脚本

2”, “测试3”]

对于列表中的 str:

打印 str

字典是 Python 中的映射数据类型,它从键映射到实际值:

帐户 = {'汤姆':'123456', '迈克':'654321'}

打印帐户['汤姆']

打印帐户[“迈克”]

3. 接口简介

提供了大量的 C API,C++通过这些 API 与 Python 进行交互。以下是一些更重要的 API 函数:

无效 Py_Initialize( )

在使用 Python 系统之前,必须使用 Py_Initialize 对其进行初始化。它加载 Python 的内置模块并将系统路径添加到模块搜索路径中。该函数没有返回值,需要检查系统是否初始化成功并Py_IsInitialized。

int PyRun_SimpleString(char *command)

直接将输入字符串作为 Python 代码运行,返回 0 表示成功,-1 表示错误。大多数情况下,错误是因为字符串中存在语法错误。

PyObject* Py_BuildValue(char *format, ...)

将C++变量转换为 Python 对象。当变量需要从 C++ 传递到 Python 时,使用此函数。此函数有点类似于 C 的 printfpython 脚本引用目录,但格式不同。常用的格式是 s 表示字符串,i 表示整数变量,f 表示浮点数,O 表示 Python 对象。PyObject*

shell 引用另一个脚本_python 引用_python 脚本引用目录

PyObject_CallObject(PyObject*callable_object, PyObject *args)

调用callable_object指向的 Python 函数,args 作为调用参数。在使用此功能之前,可以使用PyCallable_Check来检测callable_object是否为可调用的 Python 对象。

PyObject* PyImport_Import(PyObject *name)

加载由 n a m e 指定的模块。在使用PyImport_Import加载之前,可以使用PyString_FromString将模块名称转换为 Python 对象。

无效 Py_Finalize()

关闭 Python 系统,一般在程序退出时调用此函数。

【花絮】

更多关于蟒蛇

Python使用优雅的编程语法,非常接近自然语言,这使得它非常可读。

Python是一种灵活的编程语言,程序易于运行。这使其成为原型设计和特殊编程任务的理想语言;使用P y t h o n进行编程,您甚至可以少考虑程序的可维护性差。

Python 是一种面向对象的编程,支持类和多重继承。

Python 代码可以打包为模板和包。

Python 支持异常处理跟踪,可以列出清晰详细的错误消息。

Python 包括高级编程功能,如代码生成器和解释器。自动垃圾回收将您从内存管理之战中解放出来。

Python 庞大的标准库支持许多常规编程任务,例如与 Web 服务器连接、正则表达式和文件操作。

Python 的交互模式使得调试程序的一小部分非常方便;此外,在处理大型程序时python 脚本引用目录,它还具有捆绑的开发环境 - IDLE。

shell 引用另一个脚本_python 脚本引用目录_python 引用

Python 编译器易于扩展,可以将 C 或 C++ 编译的模板添加为新模板。

Python 编译器可以嵌入到另一个应用程序中,以提供可编程接口。

Python可以在许多不同类型的计算机和操作系统上运行:Windows,Mac OS,OS / 2,Unix,Linux等。

Python语言的编译器是一个开源项目,受版权保护,但免费使用和分发,甚至可以用于商业项目。

在C++中使用Python的最简单方法是用于高级应用程序

使用时初始化 Python 语言的解释器

Py_Initialize();

使用完成后中止 Python 的语言解释器

Py_Finalize();

应用此应用程序的最简单方法是直接执行脚本

PyRun_SimpleString(“import sys/n”

“打印 100+200/N”);

这是最简单的应用程序

如果要执行保存在文件中的脚本,请调用

python 引用_python 脚本引用目录_shell 引用另一个脚本

int PyRun_SimpleFile( FILE* fp , const char* 文件名)

这是最简单的调用。

函数调用终于可以返回几天前 BCB 调用 Python 的值,而不是直接在 C++ 中调用 Python 函数,而只是使用 PyRun_SimpleString() 函数来执行指定的字符串。这种调用在没有输出结果,或者输出结果在文件中等情况下仍然可以使用,但通常我们在调用函数时需要将结果返回给被调用方。在这种情况下,使用解释字符串方法不可行(可以使用输出流重定向来实现,但处理起来很复杂),调用函数的唯一方法是接受函数的返回值。

这种调用也比较简单(因为我只要求返回字符串:)),先用PyImport_ImportModule初始化要调用的模块(通常是文件名),然后用PyObject_CallMethod调用你的Python函数,当然调用函数的参数是需要设置的。

参考代码:

-----------------------------------

AnsiString ScriptPath = ExtractFilePath(Application->ExeName)+“script”;

AnsiString PyStr;

PyObject *pName, *pOs, *pArg, *pResult, *pCall;

Py_Initialize();

初始化记录器();

pOs = PyImport_ImportModule(“os.path”);

PyObject_CallMethod(pO, “join”, “(s)”, ScriptPath.c_str());

pCall = PyImport_ImportModule(“BOMandXY”);

pResult = PyObject_CallMethod(pCall, “ReadBOM”, “(s)”, FileName.c_str());

ShowMessage(PyString_AsString(pResult));

Py_Finalize();