Cython 和 Exec()?
Cython and Exec()?
如果我制作了一个名为 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
是一个在运行时执行任意代码的函数(这对于速度、maintainability/readability 和安全性来说通常是一个非常糟糕的主意)。 Cython 不支持 exec
因为这意味着可能会在运行时编译。因此,exec
执行的代码不可能是 Cython 代码。但是,exec
函数仍可用于执行 pure-Python 代码。正如@DavidW 所指出的,可以通过关闭安装脚本中的 Cython.Compiler.Options.error_on_unknown_names
(就在调用 setup
之前)来消除错误。有了这个 Cython 就不会在找不到由 exec
(或类似方法)定义的函数时抱怨。请记住,在这种情况下只能使用 CPython 而不是 Cython(这部分地破坏了首先使用 Cython 的目的)。
如果我制作了一个名为 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
是一个在运行时执行任意代码的函数(这对于速度、maintainability/readability 和安全性来说通常是一个非常糟糕的主意)。 Cython 不支持 exec
因为这意味着可能会在运行时编译。因此,exec
执行的代码不可能是 Cython 代码。但是,exec
函数仍可用于执行 pure-Python 代码。正如@DavidW 所指出的,可以通过关闭安装脚本中的 Cython.Compiler.Options.error_on_unknown_names
(就在调用 setup
之前)来消除错误。有了这个 Cython 就不会在找不到由 exec
(或类似方法)定义的函数时抱怨。请记住,在这种情况下只能使用 CPython 而不是 Cython(这部分地破坏了首先使用 Cython 的目的)。