小编Yan*_*ick的帖子

在PyCharm中使用子进程执行sudo命令

我试图从Python 3执行sudo命令.我通常使用子进程在Python中运行我的终端命令.讨论这个话题已经有很多问题,但我找不到任何适合我的解决方案.

我的Os是Ubuntu 18.04,我正在使用Python 3.6和PyCharm.

无论我如何尝试,我都无法使用子进程输入密码.尝试输入sudo密码时,我的脚本总是卡住了.在第一个答案之后,我意识到问题不在于我的代码,问题在于PyCharm.从Console运行它们时,以下所有尝试都可以正常工作,但是当我从PyCharm Interpreter运行它们时它们会卡住.以下是我尝试过的所有版本:

尝试1:

import subprocess
sudo_password = b"myPassword\n"

print(subprocess.check_output('sudo -S echo success', shell=True, input=sudo_password)) #stuck here
Run Code Online (Sandbox Code Playgroud)

这似乎是解决问题的最简单方法,但不知何故,子进程无法输入密码,在我杀死进程之前它总会卡住.

尝试2:

import subprocess
sudo_password = b"myPassword\n"

proc = subprocess.Popen('sudo -S echo success', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
proc.stdin.write(sudo_password)
proc.stdin.flush()
print(proc.stdout.readlines()) #stuck here
Run Code Online (Sandbox Code Playgroud)

在我的第二次尝试中,我试图自己处理这个似乎也没有工作的内流.在阅读流出线时,程序会卡住.当我中止代码时,我得到以下错误消息,表明控制台已被提示输入密码,但它可能以某种方式不能输入.

Traceback (most recent call last):
  File "/home/anon/sudo.py", line 7, in <module>
[sudo] password for anon:     print(proc.stdout.readlines()) #stuck here
KeyboardInterrupt
Run Code Online (Sandbox Code Playgroud)

尝试3:

我知道我可以将密码从终端传递到sudo命令:

anon@anon:~$ echo myPassword | sudo -S echo success
[sudo] password for anon: success
Run Code Online (Sandbox Code Playgroud)

所以我尝试使用子进程做同样的事情: …

python ubuntu subprocess pycharm

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

如何对自定义 Keras / Tensorflow 损失函数中的值进行排序?

介绍

我想为 Keras 实现一个自定义损失函数。我想这样做,因为我对数据集的当前结果不满意。我认为这是因为目前内置的损失函数专注于整个数据集。我只想关注数据集中的最高值。这就是为什么我提出了以下自定义损失函数的想法:

自定义损失函数的想法

自定义损失函数应取最高值的前 4 个预测,并用相应的真实值减去它。然后取该减法的绝对值,乘以一些权重,并将其添加到总损失总和中。

为了更好地理解这个自定义损失函数,我使用列表输入对其进行了编程。希望通过这个例子可以更好地理解:

以下示例计算 i=0 时的损失 = 4*abs(0.7-0.5)+3*abs(0.5-0.7)+2*abs(0.4-0.45) +1*abs(0.4-0.3) = 1.6

然后将其除以 div_top,在本例中为 10(对于 i=0,则为 0.16),对所有其他 i 重复所有操作,最后取所有样本的平均值。

top = 4
div_top = 0.5*top*(top+1)


def own_loss(y_true, y_pred):
    loss_per_sample = [0]*len(y_pred)
    for i in range(len(y_pred)):
        sorted_pred, sorted_true = (list(t) for t in zip(*sorted(zip(y_pred[i], y_true[i]))))
        for k in range(top):
            loss_per_sample[i] += (top-k)*abs(sorted_pred[-1-k]-sorted_true[-1-k])
    loss_per_sample = [t/div_top for t in loss_per_sample]
    return sum(loss_per_sample)/len(loss_per_sample)


y_pred = [[0.1, 0.4, 0.7, 0.4, 0.4, 0.5, 0.3, 0.2],
          [0.3, 0.8, 0.5, 0.3, 0.1, …
Run Code Online (Sandbox Code Playgroud)

python backend keras tensorflow loss-function

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