在PyCharm

时间:2018-07-07 15:46:13

标签: python ubuntu subprocess pycharm

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

我的操作系统是Ubuntu 18.04,我正在使用Python 3.6和PyCharm。

无论如何尝试,我都无法使用子过程输入密码。我的脚本总是在尝试输入sudo密码时卡住。在第一个答案之后,我意识到问题不关我的代码,问题出在 PyCharm 。从控制台运行以下所有尝试都可以正常工作,但是当我从PyCharm解释器运行它们时,它们会卡住。这是我尝试过的所有版本:

尝试1:

import subprocess
sudo_password = b"myPassword\n"

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

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

尝试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

在我第二次尝试时,我试图自己处理似乎也不起作用的流。读取下游行时,程序将卡住。当我中止代码时,我收到以下错误消息,指示已提示控制台输入密码,但无法输入。

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

尝试3:

我知道我可以通过终端将密码传递到sudo命令中

anon@anon:~$ echo myPassword | sudo -S echo success
[sudo] password for anon: success

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

import subprocess
sudo_password = "myPassword"

print(subprocess.check_output("echo {} | sudo -S echo success".format(sudo_password), shell=True)) #stuck here

但是,与其他所有方法一样,这种方法也被卡住了。

尝试4:

import subprocess
import os
sudo_password = "myPassword"

with open("temp.sh", 'w') as file:
    file.write("echo {} | sudo -S echo success".format(sudo_password))

print(subprocess.check_output("sh temp.sh", shell=True)) #stuck here

os.remove("temp.sh")

因此,在我的最后一次绝望尝试中,我认为如果将命令放入外壳文件并使用子进程执行该命令,则可能会成功,因为我不会直接将任何sudo命令输入到子进程。当我自己在终端中尝试时,效果很好:

anon@anon:~$ sh temp.sh 
[sudo] password for anon: success

但是Python脚本与以前一样卡在了同一位置。

有人知道这些尝试为什么失败以及我如何才能实现目标吗?在此先感谢:)

编辑:

有人联系我有关此主题的旧帖子,该帖子使用os而不是子流程。不推荐使用os,而应使用子进程,这就是为什么我本来没有在此问题中显示任何尝试的原因,但是在使用os时,它也卡住了:

import os
sudo_password = "myPassword"

p = os.system('echo {} | sudo -S echo success'.format(sudo_password)) #stuck here

编辑2:

好了,现在我想通了,如果您使用以下命令从终端运行脚本,则所有尝试以及第一个答案的建议都将有效:

anon@anon:~$ python3 checksudo.py

所以问题似乎出在我的口译员 PyCharm 上。这也是让我的问题对this question独有的原因,因为他们的问题并非来自他们的解释者。

有人对如何使代码在PyCharm中工作有任何建议吗?还是应该从控制台运行我所有的脚本?谢谢您抽出宝贵的时间。

1 个答案:

答案 0 :(得分:0)

怎么样:

caServer

当然,请确保在代码中输入了正确的密码。