下面提供在C、Python、Perl、Go、Java、JavaScript中嵌入并执行脚本代码的实例:
🔧 C 语言示例 (使用Lua脚本引擎)
#include <stdio.h>
#include <string.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
// 执行Lua脚本示例
int execute_lua_script() {
lua_State *L = luaL_newstate();
luaL_openlibs(L); // 打开Lua标准库
printf("=== Lua脚本执行示例 ===\n");
// 执行简单的Lua表达式
const char* lua_code = "return 2 + 3 * 5";
if (luaL_dostring(L, lua_code) == LUA_OK) {
int result = lua_tointeger(L, -1);
printf("Lua计算结果: %d\n", result);
lua_pop(L, 1);
}
// 执行复杂的Lua函数
const char* lua_function =
"function factorial(n)\n"
" if n <= 1 then\n"
" return 1\n"
" else\n"
" return n * factorial(n-1)\n"
" end\n"
"end\n"
"function greet(name)\n"
" return 'Hello, ' .. name\n"
"end\n"
"return '函数定义完成'";
if (luaL_dostring(L, lua_function) == LUA_OK) {
printf("Lua函数定义: %s\n", lua_tostring(L, -1));
lua_pop(L, 1);
}
// 调用Lua函数
lua_getglobal(L, "factorial");
lua_pushinteger(L, 5);
if (lua_pcall(L, 1, 1, 0) == LUA_OK) {
printf("5的阶乘: %d\n", lua_tointeger(L, -1));
lua_pop(L, 1);
}
lua_getglobal(L, "greet");
lua_pushstring(L, "World");
if (lua_pcall(L, 1, 1, 0) == LUA_OK) {
printf("问候语: %s\n", lua_tostring(L, -1));
lua_pop(L, 1);
}
lua_close(L);
return 0;
}
// 从文件执行Lua脚本
int execute_lua_file(const char* filename) {
lua_State *L = luaL_newstate();
luaL_openlibs(L);
if (luaL_dofile(L, filename) != LUA_OK) {
printf("Lua文件执行错误: %s\n", lua_tostring(L, -1));
lua_close(L);
return -1;
}
lua_close(L);
return 0;
}
int main() {
execute_lua_script();
return 0;
}
编译命令:gcc -o lua_example lua_example.c -llua -lm -ldl
🔧 Python 示例 (多种脚本引擎)
#!/usr/bin/env python3
import subprocess
import json
def execute_javascript():
"""使用Node.js执行JavaScript代码"""
print("=== JavaScript执行示例 ===")
js_code = """
function calculateCircleArea(radius) {
return Math.PI * radius * radius;
}
function fibonacci(n) {
if (n <= 1) return n;
return fibonacci(n-1) + fibonacci(n-2);
}
const result = {
area: calculateCircleArea(5),
fibonacci: fibonacci(10),
message: "来自JavaScript的问候"
};
console.log(JSON.stringify(result));
"""
try:
result = subprocess.run(['node', '-e', js_code],
capture_output=True, text=True, timeout=10)
if result.returncode == 0:
data = json.loads(result.stdout)
print(f"圆面积: {data['area']}")
print(f"斐波那契数列第10项: {data['fibonacci']}")
print(f"消息: {data['message']}")
else:
print(f"JavaScript执行错误: {result.stderr}")
except Exception as e:
print(f"执行失败: {e}")
def execute_lua_in_python():
"""使用lupa库执行Lua代码"""
try:
import lupa
from lupa import LuaRuntime
lua = LuaRuntime()
print("\\n=== Lua脚本执行示例 ===")
# 执行Lua代码
lua_code = """
function lua_factorial(n)
if n <= 1 then
return 1
else
return n * lua_factorial(n-1)
end
end
function lua_greet(name)
return "Hello from Lua, " .. name
end
return {
factorial_result = lua_factorial(6),
greeting = lua_greet("Python")
}
"""
result = lua.execute(lua_code)
print(f"Lua阶乘结果: {result['factorial_result']}")
print(f"Lua问候语: {result['greeting']}")
except ImportError:
print("请先安装lupa库: pip install lupa")
def execute_ruby_script():
"""执行Ruby脚本"""
print("\\n=== Ruby执行示例 ===")
ruby_code = """
def ruby_calculate(a, b)
{
sum: a + b,
product: a * b,
power: a ** b,
message: "来自Ruby的计算结果"
}
end
result = ruby_calculate(7, 3)
puts result.to_json
"""
try:
result = subprocess.run(['ruby', '-rjson', '-e', ruby_code],
capture_output=True, text=True)
if result.returncode == 0:
data = json.loads(result.stdout)
print(f"和: {data['sum']}")
print(f"积: {data['product']}")
print(f"幂: {data['power']}")
print(f"消息: {data['message']}")
except Exception as e:
print(f"Ruby执行失败: {e}")
def embedded_python_eval():
"""Python内置的eval和exec函数"""
print("\\n=== Python内置执行示例 ===")
# 使用eval执行表达式
expression = "2 ** 8 + 3 * 5"
result = eval(expression)
print(f"表达式 '{expression}' = {result}")
# 使用exec执行代码块
code_block = """
def python_function(x):
return x * x + 2 * x + 1
result_list = [python_function(i) for i in range(5)]
message = "Python动态执行完成"
"""
exec(code_block)
print(f"函数计算结果: {locals()['result_list']}")
print(f"消息: {locals()['message']}")
if __name__ == "__main__":
execute_javascript()
execute_lua_in_python()
execute_ruby_script()
embedded_python_eval()
🔧 Perl 示例
#!/usr/bin/perl
use strict;
use warnings;
use JSON;
print "=== Perl脚本执行示例 ===\n";
# 执行JavaScript代码
sub execute_javascript {
my $js_code = <<'JS_CODE';
function jsCalculate() {
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((a, b) => a + b, 0);
const average = sum / numbers.length;
return {
sum: sum,
average: average,
message: "来自JavaScript的计算"
};
}
console.log(JSON.stringify(jsCalculate()));
JS_CODE
open my $pipe, '-|', 'node', '-e', $js_code or die "无法执行Node.js: $!";
my $output = do { local $/; <$pipe> };
close $pipe;
my $data = decode_json($output);
print "JavaScript求和: " . $data->{sum} . "\n";
print "JavaScript平均值: " . $data->{average} . "\n";
print "消息: " . $data->{message} . "\n";
}
# 执行Python代码
sub execute_python {
my $python_code = <<'PY_CODE';
import math
import json
def python_operations():
result = {
'sqrt': math.sqrt(256),
'factorial': math.factorial(5),
'constants': {
'pi': math.pi,
'e': math.e
},
'message': '来自Python的数学计算'
}
print(json.dumps(result))
python_operations()
PY_CODE
open my $pipe, '-|', 'python', '-c', $python_code or die "无法执行Python: $!";
my $output = do { local $/; <$pipe> };
close $pipe;
my $data = decode_json($output);
print "Python平方根: " . $data->{sqrt} . "\n";
print "Python阶乘: " . $data->{factorial} . "\n";
print "Python π: " . $data->{constants}{pi} . "\n";
print "消息: " . $data->{message} . "\n";
}
# 使用eval执行Perl代码
sub execute_perl_eval {
print "\n=== Perl eval执行示例 ===\n";
# 执行表达式
my $expression = "2 ** 10 + 3 * 7";
my $result = eval $expression;
print "表达式 '$expression' = $result\n";
# 执行代码块
my $code_block = '
sub perl_calculate {
my ($x, $y) = @_;
return {
sum => $x + $y,
product => $x * $y,
power => $x ** $y
};
}
my $calc_result = perl_calculate(4, 3);
1;
';
if (eval $code_block) {
my $calc_result = perl_calculate(4, 3);
print "Perl计算 - 和: " . $calc_result->{sum} . "\n";
print "Perl计算 - 积: " . $calc_result->{product} . "\n";
print "Perl计算 - 幂: " . $calc_result->{power} . "\n";
} else {
print "Perl eval错误: $@\n";
}
}
# 主程序
execute_javascript();
execute_python();
execute_perl_eval();
🔧 Go 语言示例
package main
import (
"encoding/json"
"fmt"
"log"
"os/exec"
"strings"
)
// 执行JavaScript代码
func executeJavaScript() {
fmt.Println("=== JavaScript执行示例 ===")
jsCode := `
const calculate = (a, b) => {
return {
sum: a + b,
difference: a - b,
product: a * b,
quotient: a / b,
message: "来自Go调用的JavaScript"
};
};
const result = calculate(15, 3);
console.log(JSON.stringify(result));
`
cmd := exec.Command("node", "-e", jsCode)
output, err := cmd.Output()
if err != nil {
log.Printf("JavaScript执行错误: %v", err)
return
}
var data map[string]interface{}
if err := json.Unmarshal(output, &data); err != nil {
log.Printf("JSON解析错误: %v", err)
return
}
fmt.Printf("和: %v\n", data["sum"])
fmt.Printf("差: %v\n", data["difference"])
fmt.Printf("积: %v\n", data["product"])
fmt.Printf("商: %v\n", data["quotient"])
fmt.Printf("消息: %v\n", data["message"])
}
// 执行Python代码
func executePython() {
fmt.Println("\n=== Python执行示例 ===")
pythonCode := `
import json
import math
def python_calculations():
results = {
'circle_area': math.pi * 7 * 7,
'hypotenuse': math.hypot(3, 4),
'log_value': math.log(100, 10),
'message': '来自Go调用的Python'
}
print(json.dumps(results))
python_calculations()
`
cmd := exec.Command("python3", "-c", pythonCode)
output, err := cmd.Output()
if err != nil {
log.Printf("Python执行错误: %v", err)
return
}
var data map[string]interface{}
if err := json.Unmarshal(output, &data); err != nil {
log.Printf("JSON解析错误: %v", err)
return
}
fmt.Printf("圆面积: %v\n", data["circle_area"])
fmt.Printf("斜边长: %v\n", data["hypotenuse"])
fmt.Printf("对数值: %v\n", data["log_value"])
fmt.Printf("消息: %v\n", data["message"])
}
// 执行Lua代码
func executeLua() {
fmt.Println("\n=== Lua执行示例 ===")
luaCode := `
function lua_operations(x, y)
return {
sum = x + y,
product = x * y,
power = x ^ y,
message = "来自Go调用的Lua"
}
end
local result = lua_operations(5, 3)
-- 手动构建JSON字符串
print('{"sum":' .. result.sum .. ',"product":' .. result.product .. ',"power":' .. result.power .. ',"message":"' .. result.message .. '"}')
`
cmd := exec.Command("lua", "-e", luaCode)
output, err := cmd.Output()
if err != nil {
log.Printf("Lua执行错误: %v", err)
return
}
var data map[string]interface{}
if err := json.Unmarshal(output, &data); err != nil {
log.Printf("JSON解析错误: %v", err)
return
}
fmt.Printf("和: %v\n", data["sum"])
fmt.Printf("积: %v\n", data["product"])
fmt.Printf("幂: %v\n", data["power"])
fmt.Printf("消息: %v\n", data["message"])
}
// Go内置模板引擎示例
func goTemplateEngine() {
fmt.Println("\n=== Go模板引擎示例 ===")
templateText := `
计算结果是: {{add .A .B}}
欢迎消息: {{greet .Name}}
平方: {{square .Number}}
`
// 在实际应用中,可以使用text/template或html/template包
// 这里简化演示
data := struct {
A int
B int
Name string
Number int
}{
A: 10,
B: 20,
Name: "Gopher",
Number: 9,
}
fmt.Printf("模板数据: A=%d, B=%d, Name=%s, Number=%d\n",
data.A, data.B, data.Name, data.Number)
fmt.Printf("模拟计算结果: %d\n", data.A + data.B)
fmt.Printf("模拟问候: Hello, %s!\n", data.Name)
fmt.Printf("模拟平方: %d\n", data.Number * data.Number)
}
func main() {
executeJavaScript()
executePython()
executeLua()
goTemplateEngine()
}
🔧 Java 示例
import javax.script.*;
import java.util.*;
public class ScriptEngineExample {
public static void main(String[] args) {
System.out.println("=== Java脚本引擎示例 ===\n");
// 创建脚本引擎管理器
ScriptEngineManager manager = new ScriptEngineManager();
// 执行JavaScript
executeJavaScript(manager);
// 执行Python (需要Jython)
executePython(manager);
// 执行Groovy (需要Groovy引擎)
executeGroovy(manager);
// 多语言比较示例
compareLanguages(manager);
}
// 执行JavaScript
public static void executeJavaScript(ScriptEngineManager manager) {
try {
ScriptEngine engine = manager.getEngineByName("javascript");
if (engine == null) {
System.out.println("JavaScript引擎不可用");
return;
}
System.out.println("=== JavaScript执行 ===");
// 设置变量
engine.put("name", "Java用户");
engine.put("numbers", new int[]{1, 2, 3, 4, 5});
// 执行简单表达式
Object result = engine.eval("2 + 3 * 4");
System.out.println("JavaScript计算结果: " + result);
// 执行函数
String jsCode =
"function calculateStats(arr) {" +
" var sum = arr.reduce((a, b) => a + b, 0);" +
" var avg = sum / arr.length;" +
" return {" +
" sum: sum," +
" average: avg," +
" message: 'Hello, ' + name" +
" };" +
"}" +
"calculateStats(numbers);";
Object stats = engine.eval(jsCode);
System.out.println("JavaScript统计结果: " + stats);
// 调用函数
engine.eval("function greet(msg) { return '消息: ' + msg.toUpperCase(); }");
Invocable invocable = (Invocable) engine;
Object greeting = invocable.invokeFunction("greet", "来自Java的调用");
System.out.println(greeting);
} catch (Exception e) {
System.out.println("JavaScript执行错误: " + e.getMessage());
}
}
// 执行Python (需要Jython)
public static void executePython(ScriptEngineManager manager) {
try {
ScriptEngine engine = manager.getEngineByName("python");
if (engine == null) {
System.out.println("\nPython引擎不可用 (需要Jython)");
return;
}
System.out.println("\n=== Python执行 ===");
String pythonCode =
"def python_factorial(n):\n" +
" if n <= 1:\n" +
" return 1\n" +
" else:\n" +
" return n * python_factorial(n-1)\n" +
"\n" +
"result = python_factorial(5)\n" +
"message = 'Python计算完成'\n" +
"{'factorial': result, 'message': message}";
Object pythonResult = engine.eval(pythonCode);
System.out.println("Python计算结果: " + pythonResult);
} catch (Exception e) {
System.out.println("Python执行错误: " + e.getMessage());
}
}
// 执行Groovy
public static void executeGroovy(ScriptEngineManager manager) {
try {
ScriptEngine engine = manager.getEngineByName("groovy");
if (engine == null) {
System.out.println("\nGroovy引擎不可用");
return;
}
System.out.println("\n=== Groovy执行 ===");
String groovyCode =
"def groovyCalculate(a, b) {\n" +
" return [\n" +
" sum: a + b,\n" +
" product: a * b,\n" +
" power: a ** b,\n" +
" message: '来自Groovy的动态计算'\n" +
" ]\n" +
"}\n" +
"\n" +
"groovyCalculate(4, 3)";
Object groovyResult = engine.eval(groovyCode);
System.out.println("Groovy计算结果: " + groovyResult);
} catch (Exception e) {
System.out.println("Groovy执行错误: " + e.getMessage());
}
}
// 多语言比较
public static void compareLanguages(ScriptEngineManager manager) {
System.out.println("\n=== 多语言性能比较 ===");
String[] languages = {"javascript", "groovy"};
String testCode = "var sum = 0; for (var i = 0; i < 10000; i++) { sum += i; } sum;";
for (String lang : languages) {
try {
ScriptEngine engine = manager.getEngineByName(lang);
if (engine != null) {
long startTime = System.currentTimeMillis();
Object result = engine.eval(testCode);
long endTime = System.currentTimeMillis();
System.out.printf("%s 执行时间: %d ms, 结果: %s\n",
lang, (endTime - startTime), result);
}
} catch (Exception e) {
System.out.println(lang + " 测试失败: " + e.getMessage());
}
}
}
}
🔧 JavaScript (Node.js) 示例
const { exec, execSync, spawn } = require('child_process');
const vm = require('vm');
// 使用Node.js内置vm模块执行JavaScript
function executeWithVM() {
console.log("=== Node.js VM模块执行 ===");
// 创建沙盒环境
const sandbox = {
x: 10,
y: 20,
console: console
};
// 执行简单脚本
try {
const script = new vm.Script('result = x * y + 15;');
const context = vm.createContext(sandbox);
script.runInContext(context);
console.log(`VM计算结果: ${sandbox.result}`);
} catch (err) {
console.error('VM执行错误:', err);
}
// 执行更复杂的脚本
const complexScript = `
function calculate(a, b) {
return {
sum: a + b,
product: a * b,
power: Math.pow(a, b),
message: '来自VM的计算'
};
}
const results = calculate(x, y);
results;
`;
try {
const result = vm.runInNewContext(complexScript, sandbox);
console.log('VM复杂计算:', result);
} catch (err) {
console.error('VM复杂执行错误:', err);
}
}
// 执行Python代码
function executePython() {
console.log("\n=== 执行Python代码 ===");
const pythonCode = `
import math
import json
def main():
data = {
'circumference': 2 * math.pi * 5,
'area': math.pi * math.pow(5, 2),
'volume': (4/3) * math.pi * math.pow(5, 3),
'message': '来自Node.js调用的Python'
}
print(json.dumps(data))
if __name__ == "__main__":
main()
`;
try {
const result = execSync('python3 -c ' + JSON.stringify(pythonCode), {
encoding: 'utf8'
});
const data = JSON.parse(result);
console.log('Python几何计算:');
console.log(` 圆周长: ${data.circumference}`);
console.log(` 圆面积: ${data.area}`);
console.log(` 球体积: ${data.volume}`);
console.log(` 消息: ${data.message}`);
} catch (err) {
console.error('Python执行错误:', err);
}
}
// 执行Ruby代码
function executeRuby() {
console.log("\n=== 执行Ruby代码 ===");
const rubyCode = `
require 'json'
def ruby_calculations
results = {
factorial: (1..6).reduce(:*),
fibonacci: [0, 1, 1, 2, 3, 5, 8, 13, 21],
prime: [2, 3, 5, 7, 11, 13],
message: '来自Node.js调用的Ruby'
}
puts results.to_json
end
ruby_calculations
`;
try {
const result = execSync('ruby -e ' + JSON.stringify(rubyCode), {
encoding: 'utf8'
});
const data = JSON.parse(result);
console.log('Ruby数学计算:');
console.log(` 6的阶乘: ${data.factorial}`);
console.log(` 斐波那契数列: ${data.fibonacci.join(', ')}`);
console.log(` 质数: ${data.prime.join(', ')}`);
console.log(` 消息: ${data.message}`);
} catch (err) {
console.error('Ruby执行错误:', err);
}
}
// 执行Lua代码
function executeLua() {
console.log("\n=== 执行Lua代码 ===");
const luaCode = `
function lua_table_operations()
local tbl = {1, 2, 3, 4, 5}
local sum = 0
local product = 1
for i, v in ipairs(tbl) do
sum = sum + v
product = product * v
end
return {
original = tbl,
sum = sum,
product = product,
average = sum / #tbl,
message = "来自Node.js调用的Lua"
}
end
local result = lua_table_operations()
-- 手动输出JSON格式
print('{"sum":' .. result.sum .. ',"product":' .. result.product .. ',"average":' .. result.average .. ',"message":"' .. result.message .. '"}')
`;
try {
const result = execSync('lua -e ' + JSON.stringify(luaCode), {
encoding: 'utf8'
});
const data = JSON.parse(result);
console.log('Lua表操作:');
console.log(` 总和: ${data.sum}`);
console.log(` 乘积: ${data.product}`);
console.log(` 平均值: ${data.average}`);
console.log(` 消息: ${data.message}`);
} catch (err) {
console.error('Lua执行错误:', err);
}
}
// 使用eval函数(谨慎使用)
function executeWithEval() {
console.log("\n=== 使用eval函数 ===");
// 简单的数学表达式
const expression = '2 ** 8 + 3 * 7';
const result = eval(expression);
console.log(`表达式 "${expression}" = ${result}`);
// 函数定义和执行
const functionCode = `
(function() {
const numbers = [10, 20, 30, 40, 50];
const stats = {
count: numbers.length,
total: numbers.reduce((a, b) => a + b, 0),
max: Math.max(...numbers),
min: Math.min(...numbers)
};
stats.average = stats.total / stats.count;
return stats;
})()
`;
try {
const stats = eval(functionCode);
console.log('eval统计计算:');
console.log(` 数量: ${stats.count}, 总和: ${stats.total}`);
console.log(` 最大值: ${stats.max}, 最小值: ${stats.min}`);
console.log(` 平均值: ${stats.average}`);
} catch (err) {
console.error('eval执行错误:', err);
}
}
// 主函数
async function main() {
executeWithVM();
executePython();
executeRuby();
executeLua();
executeWithEval();
}
main().catch(console.error);
📝 使用要点说明
-
环境要求:
- C语言:需要安装Lua开发库
- Python:需要安装lupa库 (
pip install lupa) - Java:需要相应的脚本引擎 (Rhino for JavaScript, Jython for Python, Groovy for Groovy)
- 所有语言:需要安装对应的解释器 (Node.js, Python, Ruby, Lua)
-
安全考虑:
- 使用
eval()函数要特别小心,可能执行恶意代码 - 推荐使用沙盒环境或子进程执行
- 使用
-
性能考虑:
- 子进程调用有启动开销
- 内置引擎通常性能更好
-
适用场景:
- 动态配置和规则引擎
- 数学公式计算
- 插件系统和扩展功能
- 多语言集成架构
这些示例展示了各种语言中嵌入和执行脚本的不同方法,可以根据具体需求选择合适的技术方案。

被折叠的 条评论
为什么被折叠?



