运行时添加Python脚本
我刚开始学习Python,并在做一个项目。我希望能在运行时动态下载并运行一个脚本。
我的想法是能够连接到一个服务器,按需下载一个Python脚本,然后直接运行这个刚下载的脚本,而不需要重启程序或者把这个特定的脚本写死在程序里。
我正在使用的程序用Python来编写脚本和执行,而用C++来处理其他代码,比如渲染和数学运算。
我希望能用Python来运行从服务器下载的脚本(比如用户生成的内容)。
我在想这样做是否可行,或者我应该考虑用其他脚本语言(可能是LUA)来处理这种情况?
谢谢,
Th3flyboy
3 个回答
任何一种编程语言,只要能运行外部脚本,就应该能完成你的工作。这实际上意味着几乎所有的语言都可以做到。几乎所有动态语言都可以。
在Python中,有很多方法可以连接到服务器并获取网址。执行时,你可以使用subprocess模块。
这其实是可能的,但安全性非常差。
你需要使用 urllib2.urlopen 来下载内容,然后用 exec 来执行下载的结果。我不太想详细解释,因为涉及到安全问题。
编辑: 关于安全问题的解释。
在Python(CPython)中,目前没有办法创建一个 沙箱。这意味着任何不可信的代码都可以访问你机器上Python的所有功能(针对特定用户)。这可以通过使用一个专门的用户和更好的操作系统级别的解决方案来部分解决,但这些方法都比较复杂。
沙箱的一个例子是Java如何限制小程序(applet)不能完全访问机器。
Lua经常用于游戏编程。一个著名的例子就是 魔兽世界。其中一个主要原因是它可以被 沙箱化。决定允许不可信代码的功能并不简单,但至少比Python更容易确保安全。
你完全可以做到这一点。使用 urllib
来下载或生成脚本,然后导入它。只要你把脚本下载到你的 PYTHONPATH 里,它每次都会顺利运行。
举个例子:
from urllib import urlretrieve
urlretrieve('http://www.mysite.com/myscript.py', '/home/me/script.py')
import script
你也可以自己从模板生成脚本,从网上获取数据(可能是 xml 格式或者从数据库中),然后利用 Python 的文本处理功能来进行必要的调整。