我正在尝试使用ctypes和ctypeslib将C头转换为Python库。我在OSX 10.6.4(Snow Leopard)上运行Python 2.7 我要转换的头文件是mcbcio32.h,位于/header/mcbcio32.h中 我希望在同一个文件夹中创建一个xml输出,名为mcbcio32.xml。
我使用以下命令从ctypeslib文件夹运行h2xml.py(将c标头转换为包装的xml文件):
$ python h2xml.py /header/mcbcio32.h -o mcbcio32.xml -q -c
输出:
Traceback (most recent call last):
File "h2xml.py", line 92, in <module>
sys.exit(main())
File "h2xml.py", line 86, in main
compile_to_xml(argv)
File "h2xml.py", line 79, in compile_to_xml
parser.parse(files)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypeslib/codegen/cparser.py", line 306, in parse
self.create_final_xml(include_files, types, None)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypeslib/codegen/cparser.py", line 265, in create_final_xml
self.create_xml(source, xmlfile)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypeslib/codegen/cparser.py", line 97, in create_xml
stdin=subprocess.PIPE)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 672, in __init__
errread, errwrite)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1201, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
据我所知,调用了三个主要脚本,h2xml.py,cparser.py,最后是subprocess.py。所有这些脚本都是由Python开发人员编写的,因此我猜测错误在于我如何运行发出命令。
h2xml.py代码:
"""h2xml - convert C include file(s) into an xml file by running gccxml."""
import sys, os, ConfigParser
from ctypeslib.codegen import cparser
from optparse import OptionParser
def compile_to_xml(argv):
def add_option(option, opt, value, parser):
parser.values.gccxml_options.extend((opt, value))
# Hm, should there be a way to disable the config file?
# And then, this should be done AFTER the parameters are processed.
config = ConfigParser.ConfigParser()
try:
config.read("h2xml.cfg")
except ConfigParser.ParsingError, detail:
print >> sys.stderr, detail
return 1
parser = OptionParser("usage: %prog includefile ... [options]")
parser.add_option("-q", "--quiet",
dest="quiet",
action="store_true",
default=False)
parser.add_option("-D",
type="string",
action="callback",
callback=add_option,
dest="gccxml_options",
help="macros to define",
metavar="NAME[=VALUE]",
default=[])
parser.add_option("-U",
type="string",
action="callback",
callback=add_option,
help="macros to undefine",
metavar="NAME")
parser.add_option("-I",
type="string",
action="callback",
callback=add_option,
dest="gccxml_options",
help="additional include directories",
metavar="DIRECTORY")
parser.add_option("-o",
dest="xmlfile",
help="XML output filename",
default=None)
parser.add_option("-c", "--cpp-symbols",
dest="cpp_symbols",
action="store_true",
help="try to find #define symbols - this may give compiler errors, " \
"so it's off by default.",
default=False)
parser.add_option("-k",
dest="keep_temporary_files",
action="store_true",
help="don't delete the temporary files created "\
"(useful for finding problems)",
default=False)
options, files = parser.parse_args(argv[1:])
if not files:
print "Error: no files to process"
print >> sys.stderr, __doc__
return 1
options.flags = options.gccxml_options
options.verbose = not options.quiet
parser = cparser.IncludeParser(options)
parser.parse(files)
def main(argv=None):
if argv is None:
argv = sys.argv
try:
compile_to_xml(argv)
except cparser.CompilerError, detail:
print >> sys.stderr, "CompilerError:", detail
return 1
if __name__ == "__main__":
sys.exit(main())
我安装了GCC-XML,并将ctypeslib粘贴到: /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ (我的本地Python库路径)
如果有任何其他信息有用,请告诉我们。在此先感谢您的帮助。
答案 0 :(得分:1)
问题在于安装gcc-xml。确保在安装gcc-xml时还要安装cmake函数(cmake.org)。在gcc安装文件夹上正确使用cmake解决了我遇到的所有目录问题。