Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x cffi.api.CDefError:Python解析错误_Python 3.x_Rust_Python Cffi_Cffi - Fatal编程技术网

Python 3.x cffi.api.CDefError:Python解析错误

Python 3.x cffi.api.CDefError:Python解析错误,python-3.x,rust,python-cffi,cffi,Python 3.x,Rust,Python Cffi,Cffi,使用cffi,我试图在Python代码中调用一些Rust函数。 以下是python代码: from cffi import FFI def rust(solution): ffi = FFI() lib = ffi.dlopen("./libnorm.so") ffi.cdef('float norm(float**)') return lib.norm(solution) solution = [[1, 1], [1, 2], [1, 3], [1, 4]

使用cffi,我试图在Python代码中调用一些Rust函数。 以下是python代码:

from cffi import FFI

def rust(solution):
    ffi = FFI()
    lib = ffi.dlopen("./libnorm.so")
    ffi.cdef('float norm(float**)')

    return lib.norm(solution)

solution = [[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6]]
print(rust(solution))
这是防锈代码:

#! [crate_type = "dylib"]

#[no_mangle]
pub extern fn norm(array: Vec< Vec<f64>>) -> f64 {
    return array.len() as f64
}
但当我运行python脚本时,我得到了以下堆栈:

Traceback (most recent call last):
  File "/usr/lib64/python3.5/site-packages/cffi/cparser.py", line 260, in _parse
    ast = _get_parser().parse(csource)
  File "/usr/lib/python3.5/site-packages/pycparser/c_parser.py", line 151, in parse
    debug=debuglevel)
  File "/usr/lib/python3.5/site-packages/pycparser/ply/yacc.py", line 331, in parse
    return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc)
  File "/usr/lib/python3.5/site-packages/pycparser/ply/yacc.py", line 1181, in parseopt_notrack
    tok = call_errorfunc(self.errorfunc, errtoken, self)
  File "/usr/lib/python3.5/site-packages/pycparser/ply/yacc.py", line 193, in call_errorfunc
    r = errorfunc(token)
  File "/usr/lib/python3.5/site-packages/pycparser/c_parser.py", line 1723, in p_error
    self._parse_error('At end of input', self.clex.filename)
  File "/usr/lib/python3.5/site-packages/pycparser/plyparser.py", line 55, in _parse_error
    raise ParseError("%s: %s" % (coord, msg))
pycparser.plyparser.ParseError: : At end of input

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 35, in <module>
    print(rust(solution))
  File "main.py", line 28, in rust
    ffi.cdef('float norm(float**)')
  File "/usr/lib64/python3.5/site-packages/cffi/api.py", line 105, in cdef
    self._cdef(csource, override=override, packed=packed)
  File "/usr/lib64/python3.5/site-packages/cffi/api.py", line 119, in _cdef
    self._parser.parse(csource, override=override, **options)
  File "/usr/lib64/python3.5/site-packages/cffi/cparser.py", line 299, in parse
    self._internal_parse(csource)
  File "/usr/lib64/python3.5/site-packages/cffi/cparser.py", line 304, in _internal_parse
    ast, macros, csource = self._parse(csource)
  File "/usr/lib64/python3.5/site-packages/cffi/cparser.py", line 262, in _parse
    self.convert_pycparser_error(e, csource)
  File "/usr/lib64/python3.5/site-packages/cffi/cparser.py", line 291, in convert_pycparser_error
    raise api.CDefError(msg)
cffi.api.CDefError: parse error
: At end of input
回溯(最近一次呼叫最后一次):
文件“/usr/lib64/python3.5/site packages/cffi/cparser.py”,第260行,在
ast=_get_parser().parse(csource)
文件“/usr/lib/python3.5/site packages/pycparser/c_parser.py”,解析中的第151行
调试=调试级别)
文件“/usr/lib/python3.5/site packages/pycparser/ply/yacc.py”,第331行,在parse中
返回self.parseopt_notrack(输入、lexer、调试、跟踪、tokenfunc)
parseopt_notrack中的文件“/usr/lib/python3.5/site packages/pycparser/ply/yacc.py”,第1181行
tok=call_errorfunc(self.errorfunc,errtoken,self)
文件“/usr/lib/python3.5/site packages/pycparser/ply/yacc.py”,第193行,在call_errorfunc中
r=errorfunc(令牌)
文件“/usr/lib/python3.5/site packages/pycparser/c_parser.py”,第1723行,p_错误
self.\u parse\u错误('在输入末尾',self.clex.filename)
文件“/usr/lib/python3.5/site packages/pycparser/plyparser.py”,第55行,在“parse”错误中
raise ParseError(“%s:%s”%(协调,消息))
pycparser.plyparser.ParseError::输入结束时
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“main.py”,第35行,在
印刷(生锈(溶液))
文件“main.py”,第28行,在rust中
ffi.cdef(“浮动标准(浮动**)”
文件“/usr/lib64/python3.5/site packages/cffi/api.py”,第105行,在cdef中
self.\u cdef(csource,override=override,packed=packed)
文件“/usr/lib64/python3.5/site packages/cffi/api.py”,第119行,在cdef中
self._parser.parse(csource,override=override,**选项)
文件“/usr/lib64/python3.5/site packages/cffi/cparser.py”,第299行,在parse中
self.\u内部\u解析(csource)
文件“/usr/lib64/python3.5/site packages/cffi/cparser.py”,第304行,在内部解析中
ast,宏,csource=self.\u解析(csource)
文件“/usr/lib64/python3.5/site packages/cffi/cparser.py”,第262行,在
self.convert\u pycparser\u错误(e,csource)
文件“/usr/lib64/python3.5/site packages/cffi/cparser.py”,第291行,在convert\u pycparser\u错误中
raise api.CDefError(msg)
cffi.api.CDefError:解析错误
:输入结束时
我错过什么了吗

我尝试了几个版本:
ffi.cdef('float norm(float**)
。类似于
ffi.cdef('float norm(Vec))
ffi.cdef('float norm(float[]]))
但它也不起作用


感谢您以后的回复。

您不能将
Vec
放入FFI签名中。请仔细阅读。很多人都会犯这样的错误,所以如果你能告诉我你能做到这一点的任何消息来源,或者任何导致编写这段代码的思想过程,我将不胜感激。然后也许Rust社区可以从源头上解决这个问题。我没有看到这个文档,所以我认为这是可能的。我需要改变我的代码和思维方式。感谢您回答您的原始问题(即使由于
Vec
)而无法工作):您在
cdef(“xxx”)
中的函数声明末尾缺少分号。您不能将
Vec
放入FFI签名中。请仔细阅读。很多人都会犯这样的错误,所以如果你能告诉我你能做到这一点的任何消息来源,或者任何导致编写这段代码的思想过程,我将不胜感激。然后也许Rust社区可以从源头上解决这个问题。我没有看到这个文档,所以我认为这是可能的。我需要改变我的代码和思维方式。感谢您回答您的原始问题(尽管由于
Vec
,它无法工作):您在
cdef(“xxx”)
中的函数声明末尾缺少分号。
Traceback (most recent call last):
  File "/usr/lib64/python3.5/site-packages/cffi/cparser.py", line 260, in _parse
    ast = _get_parser().parse(csource)
  File "/usr/lib/python3.5/site-packages/pycparser/c_parser.py", line 151, in parse
    debug=debuglevel)
  File "/usr/lib/python3.5/site-packages/pycparser/ply/yacc.py", line 331, in parse
    return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc)
  File "/usr/lib/python3.5/site-packages/pycparser/ply/yacc.py", line 1181, in parseopt_notrack
    tok = call_errorfunc(self.errorfunc, errtoken, self)
  File "/usr/lib/python3.5/site-packages/pycparser/ply/yacc.py", line 193, in call_errorfunc
    r = errorfunc(token)
  File "/usr/lib/python3.5/site-packages/pycparser/c_parser.py", line 1723, in p_error
    self._parse_error('At end of input', self.clex.filename)
  File "/usr/lib/python3.5/site-packages/pycparser/plyparser.py", line 55, in _parse_error
    raise ParseError("%s: %s" % (coord, msg))
pycparser.plyparser.ParseError: : At end of input

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 35, in <module>
    print(rust(solution))
  File "main.py", line 28, in rust
    ffi.cdef('float norm(float**)')
  File "/usr/lib64/python3.5/site-packages/cffi/api.py", line 105, in cdef
    self._cdef(csource, override=override, packed=packed)
  File "/usr/lib64/python3.5/site-packages/cffi/api.py", line 119, in _cdef
    self._parser.parse(csource, override=override, **options)
  File "/usr/lib64/python3.5/site-packages/cffi/cparser.py", line 299, in parse
    self._internal_parse(csource)
  File "/usr/lib64/python3.5/site-packages/cffi/cparser.py", line 304, in _internal_parse
    ast, macros, csource = self._parse(csource)
  File "/usr/lib64/python3.5/site-packages/cffi/cparser.py", line 262, in _parse
    self.convert_pycparser_error(e, csource)
  File "/usr/lib64/python3.5/site-packages/cffi/cparser.py", line 291, in convert_pycparser_error
    raise api.CDefError(msg)
cffi.api.CDefError: parse error
: At end of input