相关疑难解决方法(0)

评估字符串中的数学表达式

stringExp = "2^4"
intVal = int(stringExp)      # Expected value: 16
Run Code Online (Sandbox Code Playgroud)

这将返回以下错误:

Traceback (most recent call last):  
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int()
with base 10: '2^4'
Run Code Online (Sandbox Code Playgroud)

我知道eval可以解决这个问题,但是不是有更好的 - 更重要的 - 更安全的方法来评估存储在字符串中的数学表达式吗?

python math

99
推荐指数
10
解决办法
10万
查看次数

如何限制堆大小?

我有时会编写Python程序,这些程序在执行之前很难确定它将使用多少内存.因此,我有时会调用一个试图分配大量RAM的Python程序,导致内核大量交换并降低其他正在运行的进程的性能.

因此,我希望限制Python堆可以增加多少内存.达到限制时,程序可能会崩溃.最好的方法是什么?

如果重要,很多代码都是用Cython编写的,所以它应该考虑那里分配的内存.我没有与纯Python解决方案结合(它不需要是可移植的),所以在Linux上运行的任何东西都可以.

python linux memory

47
推荐指数
1
解决办法
4万
查看次数

在Python中评估来自不安全用户输入的数学方程式

我有一个网站,用户输入数学方程式(表达式),然后根据网站提供的数据(常数)评估这些方程式.所需的数学运算,包括符号,算术运算min(),max()以及其他一些基本功能.一个示例等式可以是:

max(a * b + 100, a / b - 200)
Run Code Online (Sandbox Code Playgroud)

人们可以简单地eval()使用Python,但我们都知道这会导致网站泄露.进行数学方程式评估的安全方法是什么?

  • Python有什么数学方程式解析和评估引擎

  • 如果选择使用Python本身来评估表达式,那么任何Python沙箱都会限制Python,因此只有用户供应商操作符和函数可用.完全成熟的Python,如定义函数,应该完全禁用.子流程是可以的(参见PyPy沙箱).特别是,应该关闭用于利用内存和CPU使用的循环和其他漏洞.

  • 任何其他方法,例如使用命令行二进制(bc)?

python eval sandbox

25
推荐指数
2
解决办法
1798
查看次数

如果卡住了90秒,如何从功能返回?

可能重复:
Python函数调用超时

我想实现当函数花了超过90秒完成时它应该在超时时立即返回.有没有办法实现这一目标?

def abc(string):
    import re
    if re.match('some_pattern', string):
        return True
    else:
        return False

abc('some string to match')
Run Code Online (Sandbox Code Playgroud)

编辑

请下载测试文件.我创建了一个线程类,并在发生超时错误时在线程内引发异常.但线程仍然存在,因为它i am still alive :)甚至在异常后打印.为什么异常不会强制线程停止?

python

11
推荐指数
1
解决办法
1317
查看次数

在系数之间添加乘号(*)

我有一个用户输入功能的程序,例如sin(x)+1.我正在ast尝试通过将组件列入白名单来确定字符串是否"安全",如本答案中所示.现在我想解析字符串,*在没有它们的系数之间添加乘法()符号.

例如:

  • 3x- > 3*x
  • 4(x+5) - > 4*(x+5)
  • sin(3x)(4)- > sin(3x)*(4)(sin已经在全局变量中,否则这将是s*i*n*(3x)*(4)

有没有有效的算法来实现这一目标?我更喜欢pythonic解决方案(即不是复杂的正则表达式,不是因为它们是pythonic,而是因为我不理解它们并想要一个我能理解的解决方案.简单的正则表达式是可以的.)

sympy在一个条件下,我非常愿意使用(这对于这类事情看起来很容易):安全.显然是在引擎盖下sympy使用eval.我目前的(部分)解决方案的安全性非常好.如果有人有办法sympy使用不受信任的输入更安全,我也欢迎这一点.

python string function sympy

10
推荐指数
1
解决办法
653
查看次数

快速评估大量输入值的数学表达式(函数)

以下问题

并且他们各自的答案让我想到我如何能够有效地解析一个(或多或少可信的)用户给出的单个数学表达式(一般来说,就这个答案而言)/sf/answers/41600611/来自数据库的20k到30k输入值.我实施了快速而肮脏的基准测试,因此我可以比较不同的解

# Runs with Python 3(.4)
import pprint
import time

# This is what I have
userinput_function = '5*(1-(x*0.1))' # String - numbers should be handled as floats
demo_len = 20000 # Parameter for benchmark (20k to 30k in real life)
print_results = False

# Some database, represented by an array of dicts (simplified for this example)

database_xy = []
for a in range(1, demo_len, 1):
    database_xy.append({
        'x':float(a),
        'y_eval':0,
        'y_sympya':0,
        'y_sympyb':0,
        'y_sympyc':0,
        'y_aevala':0, …
Run Code Online (Sandbox Code Playgroud)

python eval abstract-syntax-tree sympy numexpr

9
推荐指数
1
解决办法
2902
查看次数

在python Web服务器上执行数学用户代码,最简单的安全方法是什么?

我之前已经意识到这个问题,但是这种情况略有不同.

我想运行一个python图像板(使用web.py),这将允许用户通过提交代码生成新图像.代码将采用单个函数的形式,它采用像素的x,y坐标并返回r,g,b值,例如:

def simpleGradient(xrel,yrel):
    r = xrel*256
    g = yrel*256
    b = 0
    return [r,g,b]
Run Code Online (Sandbox Code Playgroud)

只需要非常小的语法,它不一定是python.使用exec有限的范围似乎太不安全了,使用PyPy或VM似乎不必要地复杂(我对这一切都很新).

而不是沙箱化,是否有一种pythonic方式以更小的语言执行代码?是python的一个子集(解析和白名单?),还是我可以嵌入的数学导向语言?

python security web.py

8
推荐指数
1
解决办法
819
查看次数

在python中将公式作为函数参数传递

我想在Python中的函数参数中传递一个公式,其中公式是其他函数参数的组合.原则上,这将是这样的:

myfunction(x=2,y=2,z=1,formula="x+2*y/z")
6
Run Code Online (Sandbox Code Playgroud)

或更具体:

def myformula(x,y,z,formula):
   return formula(x,y,z)
Run Code Online (Sandbox Code Playgroud)

这将允许用户根据x,y和z选择任何算术表达式,而无需创建新函数.

我预见的一种可能性是在函数内的代码行中转换字符串.在Python中有什么可能吗?还是其他任何想法?谢谢

python function

4
推荐指数
1
解决办法
6223
查看次数

安全地评估简单的字符串方程式

我正在编写一个程序,其中将方程式作为字符串输入,然后求值。到目前为止,我已经提出了:

test_24_string = str(input("Enter your answer: "))
test_24 = eval(test_24_string)
Run Code Online (Sandbox Code Playgroud)

我既需要此方程式的字符串版本,也需要评估的版本。但是,这eval是非常危险的功能。int()但是,使用不起作用,因为这是一个方程式。是否存在一个Python函数,该函数将评估字符串中的数学表达式,就像输入数字一样?

python string equation python-3.x

3
推荐指数
2
解决办法
4198
查看次数