我所有的代码都是在没有考虑 asyncio 的情况下编写的;但是,我使用一个异步函数(由另一位开发人员编写;出于我的目的,它是一个黑匣子)。我们就这样称呼吧func_1
。我需要从另一个函数中调用这个函数,调用它func_2
(它本身可以在任意长的函数链中调用func_3
,func_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) 我需要使用 SSH 连接到服务器来下载文件。我有 Ubuntu,并且以标准方式设置了 SSH:我有一个ssh_config
文件,其中定义了服务器地址 ( ) 和用户名的.ssh
主机条目(例如),并且我设置了 RSA 密钥。因此,当我尝试从命令行或 bash 登录 SSH 时,我只需要使用host_key
Hostname.com
ssh 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
仅当我使用用户名和输入的密码的整体时,它才有效。这可能有点不安全。
我使用 matplotlib 来绘图,我遇到的一个问题是标准绘图尺寸似乎大得离谱(以英寸为单位)。MPL 的默认 dpi 值似乎设置为100dpi
,但绘图会以几个尺寸(如 6+ 英寸)生成。问题是,如果我将其保存为 pdf,直接大小太大,无法放在科学论文中(我宁愿将其设置为“列大小”,宽度约为一两英寸)。
但是,如果您直接指定figsize
类似
fig, ax = plt.subplots(figsize=[2.,3.])
Run Code Online (Sandbox Code Playgroud)
字体大小和标记大小保持相同的英寸大小,导致相对较大的图形项目和丑陋的图形。我更喜欢的是默认情况下出现的相同比率,但缩小到不同的英寸尺寸。
据我所知,有两种方法可以解决这个问题。要么将图形保存为标准尺寸(大约为 8 x 6 英寸或其他尺寸),然后在将其插入 LaTeX 时对其进行缩放。或者手动检查所有图形元素,并更改字体大小、标记大小和图形大小以使其完美。
在某些情况下,你无法做到前者,而后者则极其乏味。我必须弄清楚每个图形元素的正确尺寸是多少,以使其与默认值保持相同的比例。
那么,是否有另一个快速选项可以更改图形大小,同时缩放默认情况下的所有内容?
我正在使用 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
在整个作业数组完成之前“保持”状态?
我有一个生成器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)
我看到的解决方案不太好:
gen
(理想情况下不要将所有gen
's 元素提取到列表中,因为这可能会占用大量内存)。对于 3,这似乎是最好的解决方案,一个近乎完美的例子就是我上面给出的例子,但我相信它只会在gen
我们开始迭代之前将 的所有元素提取到一个元组中,这是我想避免的。
我还在试图弄清楚如何创建包,这里有一个文件结构来演示我的问题:
/main_package/
__init__.py
script1.py
sub_package/
__init__.py
model.py
Run Code Online (Sandbox Code Playgroud)
内__init__.py
的main_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) 我正在尝试绘制与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 计数的颜色,就像右上角的散点颜色显示为色调一样。我怎样才能做到这一点?
我之前已经意识到类似的问题,我看着它们并尝试应用我学到的东西,并有以下脚本:
#!/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) 我正在尝试在 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=1
和cpus-per-task=10
。请注意,func 的主要部分包含一个倾向于在两个内核上运行的 scipy 例程(即使用 200% 的 cpu 使用率,这就是我想要 10 个 …
python multiprocessing python-3.x slurm python-multiprocessing
这个问题部分是为了帮助我理解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) 我一直C0103
在Visual Studio中从pylint 收到警告,因为我试图使用2个字符的变量名称,例如hp
和gp
。该警告在此处描述:link。
约定描述[a-z_][a-z0-9_]{2,30}$
为variable-rgx
。我实际上不知道如何阅读此正则表达式或它的含义,但看起来该{2,30}
部分描述了可能的长度范围,所以(如果我错了,请纠正我)为什么不允许字符长度为2?还是会有其他原因导致诸如这样的变量名gp
出错?
当问到这个问题时,人们经常链接到PEP-8,但我不记得阅读过,变量名必须至少具有3个字符的长度。无论如何,我认为这可能是错误的形式,但我不想遵循此约定。在我的程序上下文中,非常清楚地知道2个字符的变量名称,例如gp
和hp
意味着什么,这似乎对编码样式有很大的限制。
因此,无论如何,我想做的就是专门覆盖此警告。我不想只是禁用C0103
。相反,我宁愿在文本编辑器(Visual Studio Code)中更改此设置,例如在可以使用更改pylint
args 的设置中"python.linting.pylintArgs": [...]
。那么,如果我想重写约定以允许使用2个字符的变量名,那么正确的更改是什么?还是我必须编写一个新的lintrc文件(不知道该怎么做,我更喜欢一个更简单的解决方案,仅在VSCode中进行更改)。