我试图从Python 3执行sudo命令.我通常使用子进程在Python中运行我的终端命令.讨论这个话题已经有很多问题,但我找不到任何适合我的解决方案.
我的Os是Ubuntu 18.04,我正在使用Python 3.6和PyCharm.
无论我如何尝试,我都无法使用子进程输入密码.尝试输入sudo密码时,我的脚本总是卡住了.在第一个答案之后,我意识到问题不在于我的代码,问题在于PyCharm.从Console运行它们时,以下所有尝试都可以正常工作,但是当我从PyCharm Interpreter运行它们时它们会卡住.以下是我尝试过的所有版本:
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)
这似乎是解决问题的最简单方法,但不知何故,子进程无法输入密码,在我杀死进程之前它总会卡住.
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)
我知道我可以将密码从终端传递到sudo命令:
anon@anon:~$ echo myPassword | sudo -S echo success
[sudo] password for anon: success
Run Code Online (Sandbox Code Playgroud)
所以我尝试使用子进程做同样的事情: …
介绍
我想为 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)