如果我制作了一个名为hello.py的python文件,该文件的脚本是这样的。
msg = input("insert your message here: ")
script = '''
def say_something():
print("{msg}")
'''
exec(script)
say_something()
然后我试着用Cython
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize("Hello.py")
)
它将显示如下错误:undeclared name not builtin: say_something
我确实理解为什么会发生这种情况,但我还不是python和C的专家。这只是一个例子,但它与我在一个项目中尝试做的类似。有什么办法可以解决这个问题吗?我也想找到一种将脚本字符串转换为C的方法。
我试图构建一个可编辑的python脚本。
Cython将Python函数编译为本机二进制文件,该二进制文件执行CPython解释器应该执行的操作。exec
是一个在运行时执行任意代码的函数(对于速度、可维护性/可读性和安全性来说,这通常是一个非常糟糕的想法(Cython不支持exec
,因为这意味着can将在运行时编译。因此,exec
执行的代码不能是Cython代码。但是,exec
函数仍然可以用于执行纯Python代码。如@DavidW所指出的,可以通过关闭设置脚本中的Cython.Compiler.Options.error_on_unknown_names
(就在调用setup
之前(来消除该错误。有了这个,Cython在找不到exec
(或类似方法(定义的函数时不会抱怨。请记住,CPython只能在这种情况下使用,而不能使用Cython(这在一开始就部分违背了使用Cythoon的目的(。