小编kjo*_*kjo的帖子

如何防止基于gpgme的Python脚本中的密码短语缓存?

以下简短的Python脚本采用了三个命令行参数:密码短语,输入路径和输出路径。然后,它使用密码短语对输入路径的内容进行解密,并将解密后的内容放入输出路径中。

from gpg import Context
import sys

pp = sys.argv[1]    # passphrase
enc = sys.argv[2]   # input file (assumed to be encrypted)
dec = sys.argv[3]   # output file

with open(enc, 'rb') as reader, open(dec, 'wb') as writer, Context() as ctx:

    try:

        ctx.decrypt(reader, sink=writer, passphrase=pp)

    except Exception as e:
        print(str(e), file=sys.stderr)
Run Code Online (Sandbox Code Playgroud)

只要提供了正确的密码短语,该解密就可以正常工作,但是显然可以缓存这种正确的密码短语,因此,无论随后提供的密码短语如何,任何后续的解密尝试都将成功。(在本文结尾处,我会详细说明我的意思以及版本详细信息。)

显然,正在进行一些密码短语缓存,但是我不太了解细节。

我想知道的是:如何修改Python脚本,以使其禁用密码短语的缓存?请注意,我对如何在脚本之外禁用密码短语缓存不感兴趣!我希望脚本自动禁用密码短语缓存。那可能吗?


这是我上面提到的内容的详细示例。该脚本./demo.py是我上面列出的源。重要说明:仅当我从命令行执行该代码时,以下给出的代码才会显示其行为。如果我将其放在文件中并以脚本形式执行(或将其作为源文件),则所有密码错误的解密都会失败,而不管之前是否使用正确的密码成功进行了解密。

# Prologue: preparation

# First, define some variables

% ORIGINAL=/tmp/original.txt
% ENCRYPTED=/tmp/encrypted.gpg
% DECRYPTED=/tmp/decrypted.txt
% PASSPHRASE=yowzayowzayowza

# Next, create a cleartext original:

% echo …
Run Code Online (Sandbox Code Playgroud)

python gpgme

6
推荐指数
1
解决办法
361
查看次数

如何解决 git-diff 异常缓慢的问题?

我最近克隆了一个远程存储库,其中一些git命令运行速度非常慢。例如,运行

git diff --quiet
Run Code Online (Sandbox Code Playgroud)

...需要约 40 秒。(就其价值而言,该存储库是干净的。我使用的是git版本 2.20.1。)

在试图找出导致这种缓慢的原因时,我遇到了一些废除它的程序,尽管我不知道为什么。

在这些过程中,我发现的最简单/最快的过程是:(从新克隆的存储库实例开始)创建一个分支master,然后将其签出。master此后,如果我再次检查,现在git diff --quiet会很快完成(低于 50 毫秒)。

下面是一个示例交互,显示了各种操作的计时信息1

rm -rf ./"$REPONAME"      #  0.174 s
git clone "$URL"          # 54.118 s
cd ./"$REPONAME"          #  0.007 s

git diff --quiet          # 39.438 s

git branch VOODOO         #  0.032 s
git checkout VOODOO       # 31.247 s
git diff --quiet          #  0.014 s

git checkout master       #  0.034 s
git diff --quiet          #  0.012 s …
Run Code Online (Sandbox Code Playgroud)

git git-diff

6
推荐指数
1
解决办法
3250
查看次数

如何在 yield-calling 函数中防止或捕获 StopIteration 异常?

yield由于未处理的StopIteration异常,我们库之一中的生成器返回函数(即其中包含语句的函数)在某些测试中失败。为方便起见,在这篇文章中,我将此函数称为buggy.

我一直没能找到buggy防止异常的方法(不影响函数的正常运行)。类似地,我还没有找到一种方法来陷阱异常(具有try/except内)buggy

(使用的客户端代码buggy可以捕获此异常,但这发生为时已晚,因为具有正确处理导致此异常的条件所需的信息的代码是buggy函数。)

我正在使用的实际代码和测试用例过于复杂,无法在此处发布,因此我创建了一个非常简单但也非常人为的玩具示例来说明问题。

一、具有buggy功能的模块:

# mymod.py

import csv  # essential!

def buggy(csvfile):
    with open(csvfile) as stream:

        reader = csv.reader(stream)

        # how to test *here* if either stream is at its end?

        for row in reader:
            yield row
Run Code Online (Sandbox Code Playgroud)

如评论所示,使用csv模块(来自 Python 3.x 标准库)是此问题1的基本特征。

该示例的下一个文件是一个脚本,用于代表“客户端代码”。换句话说,这个脚本在这个例子之外的“真正目的”在很大程度上是无关紧要的。它在示例中的作用是提供一种简单、可靠的方法来引出buggy函数的问题。(例如,它的一些代码可以重新用于测试套件中的测试用例。)

#!/usr/bin/env python3

# myscript.py

import sys
import …
Run Code Online (Sandbox Code Playgroud)

python csv exception generator python-3.x

6
推荐指数
1
解决办法
226
查看次数

如何为类提供类似语句的功能?

[我为无能的头衔道歉; 我无法想出更好的东西.欢迎提出更好的头衔.]

我想实现HDF5文件的接口,通过文件锁定支持多进程级并发.此模块的预期环境是通过NFS访问共享磁盘的Linux群集.目标是通过在多个不同主机上运行的多个并行进程启用对同一文件的并发访问(通过NFS).

我希望能够通过类的包装类实现锁定功能h5py.File.(h5py已经提供了对线程级并发的支持,但底层的HDF5库不是线程安全的.)

如果我能按照这个精神做一些事情会很棒:

class LockedH5File(object):
    def __init__(self, path, ...):
        ...
        with h5py.File(path, 'r+') as h5handle:
            fcntl.flock(fcntl.LOCK_EX)
            yield h5handle
        # (method returns)
Run Code Online (Sandbox Code Playgroud)

我意识到上面的代码是错误的,但我希望它传达了主要的想法:即,让表达式LockedH5File('/path/to/file')为客户端代码提供一个打开的句柄,然后可以对它执行各种任意的读/写操作.当此句柄超出范围时,其析构函数会关闭句柄,从而释放锁定.

促使这种安排的目标是双重的:

  1. 句柄的创建(通过库代码)与随后在句柄上请求的操作(通过客户端代码)分离,并且

  2. 无论在执行干预代码期间发生什么(例如,异常,未处理的信号,Python内部错误),确保句柄关闭并释放锁定.

如何在Python中实现这种效果?

谢谢!

python concurrency with-statement

5
推荐指数
2
解决办法
651
查看次数

numpy:ndenumerate用于蒙面数组?

有没有办法枚举被屏蔽的非掩码位置numpy ndarray(例如,ndenumerate以常规方式ndarrays,但省略所有被屏蔽的条目)?

编辑:更精确:枚举不仅应该跳过掩码条目,还要显示原始数组中非掩码条目的索引.例如,如果1-d数组的前五个元素被屏蔽,而下一个元素的未屏蔽值为3,那么枚举应该以类似的方式开始((5,), 3), ....

谢谢!

PS:请注意,尽管可以应用于ndenumerate屏蔽ndarray,但结果枚举不会区分其屏蔽和正常条目.实际上,ndenumerate它不仅不会从枚举中过滤掉屏蔽的条目,而且甚至不会用枚举替换枚举值masked.因此,ndenumerate只需ndenumerate用合适的过滤器包裹就不能适应这项任务.

python numpy

5
推荐指数
2
解决办法
1733
查看次数

如何避免重复dict键?

下面的脚本说明的能力setfrozenset,我想明白了,如果可能的话在collections.MutableSet的子类复制.(顺便说一句,这个功能是不是只是一个怪异setfrozenset:它在Python的单元测试这些类型的主动验证.)

该脚本为类似于集合的对象的几种类型/类中的每一种执行以下步骤:

  1. 创建一个dict,dn键是专门检测的整数,用于跟踪__hash__调用方法的次数(其d值是全部None,但这是无关紧要的);
  2. 计算(并保存以后)到目前为止(即在创建期间)调用密钥__hash__方法的累计次数;dd
  3. s使用d构造函数的参数创建当前类集类型/类的对象(因此,d's键将成为结果对象的内容,而d将忽略的值);
  4. 重做(2)中描述的计算;
  5. 输出上述(2)和(4)的计算结果.

n是所有类型/类的设置为10 的情况的输出(我在本文末尾给出了完整的代码):

set: 10 10
frozenset: 10 10
Set: 10 20
myset: 10 20
Run Code Online (Sandbox Code Playgroud)

结论很清楚:构造a setfrozensetfrom d不需要调用key 的__hash__方法d,因此在这些构造函数返回后调用计数保持不变.但是,当实例Setmyset创建实例时,情况并非如此d.在每种情况下,似乎每个d's键'都__hash__被调用一次.

我如何修改myset(见下文),以便运行其构造函数d作为其参数导致不调用d …

python set

5
推荐指数
1
解决办法
762
查看次数

findall/finditer 在流上?

有没有办法将功能re.findall或更好的re.finditer功能应用于流(即打开文件句柄以供读取)?

请注意,我并不假设要匹配的模式完全包含在一行输入中(即允许多行模式)。我也不假设最大匹配长度。

确实,在这种通用性级别上,可以指定一个正则表达式,该正则表达式要求正则表达式引擎有权访问整个字符串(例如r'(?sm).*'),当然,这意味着必须将整个文件读入内存,但我目前并不关心这种最坏的情况。毕竟,完全有可能编写不需要将整个文件读入内存的多行匹配正则表达式

是否可以从已编译的正则表达式访问底层自动机(或内部使用的任何内容),为其提供字符流?

谢谢!

编辑:添加了有关多行模式和匹配长度的说明,以响应 Tim Pietzcker 和 rplnt 的答案。

python regex stream

5
推荐指数
1
解决办法
1168
查看次数

intersection_update for dicts?

我想要一个实现intersection_update方法的字典类,在精神上类似于dict.update但仅将更新限制为调用实例中已存在的那些键(参见下面的一些示例实现).

但是,根据Wheel Reinvention Avoidance的精神,在我开始实现(以及编写测试等)具有这种附加功能的映射类之前,这样的事情是否已经存在于一个或多或少的标准模块中?


要清楚,intersection_update我想到的方法会做这样的事情:

def intersection_update(self, other):
    for k in self.viewkeys() & other.viewkeys():
        self[k] = other[k]
Run Code Online (Sandbox Code Playgroud)

...虽然实际的实现可能会尝试一些可能的优化,例如:

def intersection_update(self, other):
    x, y = (self, other) if len(self) < len(other) else (other, self)
    for k in x.iterkeys():
        if k in y:
            self[k] = other[k]
Run Code Online (Sandbox Code Playgroud)

编辑:在这篇文章的原始版本中,我曾写过"或者,有没有一个标准的Python成语,不需要实现[带有一个intersection_update方法]?",但我几乎立即删除它,因为,经过进一步的反思,我意识到这是一个弱回答的邀请,因为我已经足够了解Python语言的"核心",以确定不存在这样的习语,至少没有一个能够与优势相匹配的(普遍性,易读性,易于打字)一种专用方法.

python dictionary intersection

5
推荐指数
1
解决办法
367
查看次数

如何从另一个数据框中减去一个?

首先,让我踏上舞台.

我从pandas数据框开始klmn,看起来像这样:

In [15]: klmn
Out[15]: 
    K  L         M   N
0   0  a -1.374201  35
1   0  b  1.415697  29
2   0  a  0.233841  18
3   0  b  1.550599  30
4   0  a -0.178370  63
5   0  b -1.235956  42
6   0  a  0.088046   2
7   0  b  0.074238  84
8   1  a  0.469924  44
9   1  b  1.231064  68
10  2  a -0.979462  73
11  2  b  0.322454  97
Run Code Online (Sandbox Code Playgroud)

接下来,我分成klmn两个数据帧,klmn0klmn1 …

pandas

5
推荐指数
2
解决办法
1万
查看次数

如何定义一个“die”shell函数?

注意:这不是In bash, is there a equal to die "error msg" 的重复,如本文末尾所示。

考虑 shell 函数

foo () {
    echo "testing..." 1>&2
    return 1
    echo "should never reach this point" 1>&2
}
Run Code Online (Sandbox Code Playgroud)

下面显示了foo的预期行为:

% foo || echo $?
testing...
1
Run Code Online (Sandbox Code Playgroud)

我想将 前行所示的功能封装foo在一个函数中die,以便 的定义foo可以简化为

foo () {
    die 1 "testing..."
    echo "should never reach this point" 1>&2
}
Run Code Online (Sandbox Code Playgroud)

...同时仍保留其原始行为。

我的兴趣主要是zsh,但也会对适合和bash/或/bin/sh脚本的答案感兴趣,如果它们不同的话。


顺便说一句,这行不通:

die () {
    local …
Run Code Online (Sandbox Code Playgroud)

shell zsh

5
推荐指数
1
解决办法
829
查看次数