小编Mar*_*ses的帖子

如何在同步代码中调用异步函数并打破异步/等待链(即如何将异步函数包装在同步函数中)

我所有的代码都是在没有考虑 asyncio 的情况下编写的;但是,我使用一个异步函数(由另一位开发人员编写;出于我的目的,它是一个黑匣子)。我们就这样称呼吧func_1。我需要从另一个函数中调用这个函数,调用它func_2(它本身可以在任意长的函数链中调用func_3func_4等等......)。

由于func_1是异步的,我需要等待它,但由于我在 中调用它func_2,所以我也需要进行func_2异步(我不能在非异步函数中等待)。这样的情况一直持续下去;我需要将整个函数链func_2, func_3,转换func_4为异步函数。

有办法避免这种情况吗?我只想调用func_1,等待它完成,然后在我的正常 python 代码的其余部分中使用结果。我可以创建一个包装器func_1来允许这样做吗?

我想要的基本上是以下内容,但不起作用:

# This is the function defined by someone else
async def func_1(*args):
    return something(*args)

# This is my wrapper
def func_1_wrapper(*args):
    return await func_1(*args)

# So that I can call it like normal within the rest of my code
def func_2(*args):
    # do something
    a …
Run Code Online (Sandbox Code Playgroud)

python async-await python-asyncio

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

将 ssh_config 文件与 Paramiko 一起使用

我需要使用 SSH 连接到服务器来下载文件。我有 Ubuntu,并且以标准方式设置了 SSH:我有一个ssh_config文件,其中定义了服务器地址 ( ) 和用户名的.ssh主机条目(例如),并且我设置了 RSA 密钥。因此,当我尝试从命令行或 bash 登录 SSH 时,我只需要使用host_keyHostname.comssh host_key

我想用Python 来做这个。标准解决方案似乎是使用 Paramiko 来建立连接。我试过这个:

from paramiko import SSHClient
from scp import SCPClient

ssh = SSHClient()
ssh.load_system_host_keys()
ssh.connect('host_key')

scp = SCPClient(ssh.get_transport())
# etc...
Run Code Online (Sandbox Code Playgroud)

然而,它似乎总是挂起并超时ssh.connect('host_key')。即使当我尝试包含用户名和密码时:ssh.connect('host_key', username='usrnm', password='pswd')

我的主机密钥未正确加载吗?这也能处理 RSA 密钥吗?

Hostname.com仅当我使用用户名和输入的密码的整体时,它才有效。这可能有点不安全。

python ssh openssh paramiko

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

如何在 matplotlib 中“缩小”绘图,保持所有尺寸比例相同,但减小尺寸(以英寸为单位)?

我使用 matplotlib 来绘图,我遇到的一个问题是标准绘图尺寸似乎大得离谱(以英寸为单位)。MPL 的默认 dpi 值似乎设置为100dpi,但绘图会以几个尺寸(如 6+ 英寸)生成。问题是,如果我将其保存为 pdf,直接大小太大,无法放在科学论文中(我宁愿将其设置为“列大小”,宽度约为一两英寸)。

但是,如果您直接指定figsize类似

fig, ax = plt.subplots(figsize=[2.,3.])
Run Code Online (Sandbox Code Playgroud)

字体大小和标记大小保持相同的英寸大小,导致相对较大的图形项目和丑陋的图形。我更喜欢的是默认情况下出现的相同比率,但缩小到不同的英寸尺寸。

据我所知,有两种方法可以解决这个问题。要么将图形保存为标准尺寸(大约为 8 x 6 英寸或其他尺寸),然后在将其插入 LaTeX 时对其进行缩放。或者手动检查所有图形元素,并更改字体大小、标记大小和图形大小以使其完美。

在某些情况下,你无法做到前者,而后者则极其乏味。我必须弄清楚每个图形元素的正确尺寸是多少,以使其与默认值保持相同的比例。

那么,是否有另一个快速选项可以更改图形大小,同时缩放默认情况下的所有内容?

python plot matplotlib scipy python-3.x

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

如何阻止脚本直到 slurm 作业(从 srun 开始)完全完成?

我正在使用 SLURM 运行一个作业数组,其中包含以下作业数组脚本(我使用它运行sbatch job_array_script.sh [args]

#!/bin/bash

#SBATCH ... other options ...

#SBATCH --array=0-1000%200

srun ./job_slurm_script.py $1 $2 $3 $4

echo 'open' > status_file.txt
Run Code Online (Sandbox Code Playgroud)

为了解释一下,我想job_slurm_script.py作为一个数组作业运行 1000 次,最多并行 200 个任务。当所有这些都完成后,我想写 'open' 到status_file.txt. 这是因为实际上我有超过 10,000 个作业,这高于我的集群的 MaxSubmissionLimit,所以我需要将它拆分成更小的块(在 1000 个元素的作业数组中)并一个接一个地运行它们(仅当前一个完成)。

但是,为了使其工作,echo 语句只能在整个作业数组完成后触发(除此之外,我有一个循环来检查status_file.txt作业是否完成,即当内容是字符串“open”时) .

到目前为止,我认为srun将脚本保留到整个作业数组完成。然而,有时srun“返回”并且脚本会在作业完成之前转到 echo 语句,因此所有后续作业都会从集群中反弹,因为它超出了提交限制。

那么如何srun在整个作业数组完成之前“保持”状态?

cluster-computing slurm

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

如何在不消耗生成器的情况下测试它

我有一个生成器gen,具有以下属性:

  • 让它产生收益是相当昂贵的(比创建生成器更昂贵)
  • 元素占用相当多的内存
  • 有时所有调用__next__都会引发异常,但创建生成器并不会告诉您何时会发生异常

我自己没有实现生成器。

有没有一种方法可以使生成器产生其第一个元素(我将在 try/ except 中执行此操作),而如果我随后循环遍历它,则生成器随后不会在第二个元素上启动?

我想创建一些这样的代码:

try:
    first = next(gen)
except StopIterator:
    return None
except Exception:
    print("Generator throws exception on a yield")

# looping also over the first element which we yielded already
for thing in (first, *gen):
    do_something_complicated(thing)
Run Code Online (Sandbox Code Playgroud)

我看到的解决方案不太好:

  1. 创建生成器,测试第一个元素,创建一个新生成器,循环第二个元素。
  2. 将整个 for 循环放入 try/ except 中;不太好,因为yield抛出的异常非常普遍,它可能会捕获其他东西。
  3. 生成第一个元素,对其进行测试,然后从第一个元素和其余元素重组一个新的生成器gen(理想情况下不要将所有gen's 元素提取到列表中,因为这可能会占用大量内存)。

对于 3,这似乎是最好的解决方案,一个近乎完美的例子就是我上面给出的例子,但我相信它只会在gen我们开始迭代之前将 的所有元素提取到一个元组中,这是我想避免的。

python yield generator

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

Python:从同一个包导入子模块或子包

我还在试图弄清楚如何创建包,这里有一个文件结构来演示我的问题:

/main_package/
    __init__.py
    script1.py
    sub_package/
         __init__.py
         model.py
Run Code Online (Sandbox Code Playgroud)

__init__.pymain_package,让我们说我有:

import main_package.script1
...
Run Code Online (Sandbox Code Playgroud)

并在script1.py我有:

from sub_package import model
...
Run Code Online (Sandbox Code Playgroud)

这不起作用.当我尝试导入时main_package,在以下一组调用中出现错误:import main_package.script1- >from sub_package import model

显然from sub_package import model内部script1.py不起作用.

我尝试了以下方法:

from main_package.sub_package import model

from . import sub_package.model

from .sub_package import model

而且它们都不起作用.对不起,如果我在某个地方犯了一个愚蠢的错误,但是解决问题的方法是什么?


更新:好的,有些人确切地询问了这是怎么发生的,所以我将发布我得到的实际错误信息以及我的实际结构和程序.对不起,名字现在从上面改了.

这是导致错误的包的真正包结构:

script.py
/MCMC2/
    __init__.py
    main_script.py
    ExoData.py
    Models/
         __init__.py
         model_main.py
Run Code Online (Sandbox Code Playgroud)

script.py在终端(即ipython script.py [args])中运行并得到以下错误消息(我删除了问题消息之后的所有内容并将其替换...为使其更清晰).

ImportError                               Traceback (most recent …
Run Code Online (Sandbox Code Playgroud)

python python-3.x

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

在seaborn.PairGrid上将多个数据集绘制为具有不同颜色的kdeplots

我正在尝试绘制与seaborn文档中描述的情况非常相似的情况: http://seaborn.pydata.org/tutorial/axis_grids.html#plotting-pairwise-relationships-with-pairgrid-and-pairplot

可以在下面的几张图表中找到所讨论的示例,其中sns.PairGrid使用 iris 数据集绘制了 。他们将不同的物种绘制在样本对网格上,并将物种颜色编码为色调。

我基本上想做到这一点,但是使用 kde 等高线图。我得到的数据格式与它们相同:

new_HP.head()
          A         C     logsw Mass Range
0 -3.365547  0.977325  6.172032          0
1 -0.836703  0.962374  5.949639          0
2 -0.522476  0.931787  5.967940          0
3 -0.508345  0.974561  5.929046          0
4 -0.753747  0.905854  6.027479          0
Run Code Online (Sandbox Code Playgroud)

“质量范围”取值 0、1、2、3。和

g = sns.PairGrid(new_HP, vars=['A', 'C', 'logsw'], hue="Mass Range")
g.map_diag(sns.kdeplot)
g.map_lower(sns.kdeplot)
g.map_upper(plt.scatter)
Run Code Online (Sandbox Code Playgroud)

我得到以下情节kde轮廓都是一样的颜色而且丑陋。 我想为每个“质量范围”箱设置 kde 计数的颜色,就像右上角的散点颜色显示为色调一样。我怎样才能做到这一点?

python matplotlib seaborn

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

在bash脚本中嵌入expect

我之前已经意识到类似的问题,我看着它们并尝试应用我学到的东西,并有以下脚本:

#!/bin/bash

if [ `hostname` = 'EXAMPLE' ]
then

/usr/bin/expect << EOD

spawn scp -rp host:~/outfiles/ /home/USERNAME/outfiles/
expect "id_rsa':"
send "PASSWORD\r"
interact

spawn scp -rp host:~/errfiles/ /home/USERNAME/errfiles/
expect "id_rsa':"
send "PASSWORD\r"
interact

expect eof

EOD

echo 'Successful download'
fi
Run Code Online (Sandbox Code Playgroud)

不幸的是它似乎不起作用,我收到一条错误消息:

spawn scp -rp host:~/outfiles/ /home/USERNAME/outfiles/
Enter passphrase for key '/home/USERNAME/.ssh/id_rsa': interact: spawn id exp0 not open
    while executing
"interact"
Run Code Online (Sandbox Code Playgroud)

我不知道它意味着什么,为什么它不起作用.但是,当我使用非嵌入式期望脚本编写上述代码时:

#!/usr/bin/expect

spawn scp -rp host:~/outfiles/ /home/USERNAME/outfiles/
expect "id_rsa':"
send "PASSWORD\r"
interact

spawn scp -rp host:~/errfiles/ /home/USERNAME/errfiles/
expect "id_rsa':"
send "PASSWORD\r" …
Run Code Online (Sandbox Code Playgroud)

bash expect

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

在 Slurm 中使用 Python 多处理,以及我需要哪种 ntasks 或 ncpus 组合

我正在尝试在 slurm 集群上运行 python 脚本,并且我正在使用 python 的内置multiprocessing模块。

我使用了一个非常简单的设置,出于测试目的,示例是:

len(arg_list)
Out[2]: 5

threads = multiprocessing.Pool(5)
output = threads.map(func, arg_list)
Run Code Online (Sandbox Code Playgroud)

Sofunc中的 5 个参数并行应用 5 次arg_list。我想知道的是如何在 slurm 中分配正确数量的 cpu/任务以使其按预期工作。这是我的 slurm 批处理脚本的相关部分的样子:

#!/bin/bash

# Runtime and memory
#SBATCH --time=90:00:00
#SBATCH --mem-per-cpu=2G

# For parallel jobs
#SBATCH --cpus-per-task=10
##SBATCH --nodes=2
#SBATCH --ntasks=1
##SBATCH --ntasks-per-node=4  

#### Your shell commands below this line ####

srun ./script_wrapper.py 'test'
Run Code Online (Sandbox Code Playgroud)

如您所见,目前我有ntasks=1cpus-per-task=10。请注意,func 的主要部分包含一个倾向于在两个内核上运行的 scipy 例程(即使用 200% 的 cpu 使用率,这就是我想要 10 个 …

python multiprocessing python-3.x slurm python-multiprocessing

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

(KeyError):MultiIndex Slicing要求索引是完全lexsorted元组的...为什么这是由列表引起的,而不是由元组引起的?

这个问题部分是为了帮助我理解lex-sorting在多索引的上下文中的含义.

假设我有一些MultiIndexed DataFrame df,对于我想要使用的索引:

a = (1, 1, 1)
Run Code Online (Sandbox Code Playgroud)

所以从我写的数据帧中提取值:

df.loc[a, df.columns[i]]
Run Code Online (Sandbox Code Playgroud)

哪个有效.但以下不是:

df.loc[list(a), df.columns[i]]
Run Code Online (Sandbox Code Playgroud)

给我错误:

*** KeyError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (1), lexsort depth (0)'
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

另外,另一个问题是,以下性能警告意味着什么?

PerformanceWarning: indexing past lexsort depth may impact performance.
Run Code Online (Sandbox Code Playgroud)

pandas

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

如何在Visual Studio Code中修改Pylint的变量命名约定

我一直C0103在Visual Studio中从pylint 收到警告,因为我试图使用2个字符的变量名称,例如hpgp。该警告在此处描述:link

约定描述[a-z_][a-z0-9_]{2,30}$variable-rgx。我实际上不知道如何阅读此正则表达式或它的含义,但看起来该{2,30}部分描述了可能的长度范围,所以(如果我错了,请纠正我)为什么不允许字符长度为2?还是会有其他原因导致诸如这样的变量名gp出错?

当问到这个问题时,人们经常链接到PEP-8,但我不记得阅读过,变量名必须至少具有3个字符的长度。无论如何,我认为这可能是错误的形式,但我不想遵循此约定。在我的程序上下文中,非常清楚地知道2个字符的变量名称,例如gphp意味着什么,这似乎对编码样式有很大的限制。

因此,无论如何,我想做的就是专门覆盖此警告。我不想只是禁用C0103。相反,我宁愿在文本编辑器(Visual Studio Code)中更改此设置,例如在可以使用更改pylintargs 的设置中"python.linting.pylintArgs": [...]。那么,如果我想重写约定以允许使用2个字符的变量名,那么正确的更改是什么?还是我必须编写一个新的lintrc文件(不知道该怎么做,我更喜欢一个更简单的解决方案,仅在VSCode中进行更改)。

python pylint visual-studio-code pylintrc

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