Mag*_*nus 1 c python gcc code-generation
我正在尝试用Python编写代码生成器脚本,它生成一个C源文件,编译并运行它.但是,我无法从脚本中调用gcc.
一个简单的hello world示例:
import subprocess
basename = "CodeGenTest";
execname = basename;
srcname = basename + ".c";
codeList = [];
codeList.append("#include <stdio.h>");
codeList.append("int main(int argc, char *argv[])\n{");
codeList.append("printf(\"Hello world.\\n\");");
codeList.append("}");
# Convert codelist to string.
codeList.append("");
codeString = "\n".join(codeList);
# Print code to output source file
outfile=open(srcname,'w');
outfile.write(codeString);
outfile.close;
print "Compile.";
cmd = ["gcc", "-O2", srcname, "-o", execname];
p = subprocess.Popen(cmd);
p.wait();
subprocess.call(["./"+execname]);
Run Code Online (Sandbox Code Playgroud)
如果我运行此脚本,我会收到以下错误输出
Compile.
Undefined symbols:
"_main", referenced from:
start in crt1.10.6.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
如果我在python解释器shell中执行完全相同的操作,它可以正常工作.我也可以直接在shell中编译代码而没有问题.
我尝试了各种变体,使用subprocess.Popen(),subprocess.call(),我可以想到的所有可能的参数组合,仍然是同样的问题.
任何人都知道这可能是我的问题吗?
改变这个
outfile.close;
Run Code Online (Sandbox Code Playgroud)
对此:
outfile.close()
Run Code Online (Sandbox Code Playgroud)
你实际上并没有关闭文件,所以Python没有刷新它的缓冲区,因此源文件中的所有内容都是空文件.当gcc编译一个空文件时,它会抱怨没有main函数可以作为程序的入口点.
我还建议您p.returncode在尝试执行(可能不存在的)输出二进制文件之前检查是否为0以确保gcc成功.
此外,没有必要用分号结束每个语句.如果每行有多个语句,则只需要一个分号,在这种情况下,在语句之间需要它们.当没有反斜杠时,行尾服务器作为语句终止符.