首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UndefinedVariableError在转换.py文件时包括df.query("foo=@bar")等行为.pyd文件

UndefinedVariableError在转换.py文件时包括df.query("foo=@bar")等行为.pyd文件
EN

Stack Overflow用户
提问于 2020-06-29 03:11:15
回答 1查看 168关注 0票数 1

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

我的问题是,如何将包含df.query("foo=@bar")等行的python文件转换为Cython。

如何复制此错误:

foo.py

代码语言:javascript
复制
import pandas as pd
bar=1
df=pd.DataFrame([1,2,3,4,5],columns=['test'])
print(df.query("test==@bar"))

setup.py

代码语言:javascript
复制
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

代码语言:javascript
复制
from sample_code import foo

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-29 07:32:44

正如@hpaulj在评论中所说:@bar将无法工作,因为它使用Python机制来查找调用者的字典。Cython不生成信息。

基于the documentation for DataFrame.Eval,您可以传递关键字参数locals_dictglobals_dict。所以你可以这样做:

代码语言:javascript
复制
df.query("test==@bar", locals_dict={'bar': bar})

代码语言:javascript
复制
df.query("test==@bar", locals_dict=locals())

值得强调的是,简单地将其放在Cython文件中没有任何性能优势。性能将取决于Pandas的性能,并且您已经编译了调用Pandas的文件,这一点都没有区别。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62630646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档