转换.py文件时,出现UndefinedVariableError时,将df.query(“ foo = @ bar”)之类的行转换为.pyd文件

亚瑟

我从未使用过Cython,但需要加密我的源代码。

我的问题是,我如何转换包含像df.query("foo=@bar")Cython这样的行的python文件

如何复制此错误:

foo.py

import pandas as pd
bar=1
df=pd.DataFrame([1,2,3,4,5],columns=['test'])
print(df.query("test==@bar"))

setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [
    Extension("sample_code",  ["foo.py"]),
]

setup(
    name = 'My Program',
    cmdclass = {'build_ext': build_ext},
    ext_modules = ext_modules
)

然后,运行 python setup.py build_ext --inplace

from sample_code import foo

我得到了错误:pandas.core.computation.ops.UndefinedVariableError: local variable 'bar' is not defined

戴维

就像@hpaulj在评论中说的那样:@bar它行不通,因为它使用Python自省机制来查找调用方的字典。Cython不会生成信息。

根据的文档,DataFrame.Eval您可以传递关键字参数locals_dictglobals_dict因此,您可以执行以下任一操作:

df.query("test==@bar", locals_dict={'bar': bar})

要么

df.query("test==@bar", locals_dict=locals())

值得强调的是,仅将其放在Cython文件中不会带来性能优势。性能将取决于Pandas的性能,并且您已经编译了调用Pandas的文件这一事实完全没有任何区别。

在您的情况下,它还提供了有限的“加密”优势-"test==@bar"绝对可以在已编译的Cython文件中找到该字符串

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章