问题描述
问题:是否有使用Subprocess或else模块举行会议的选项? 每次仅运行一条指令或命令。 我找不到任何直接的解决方案。为什么只有这样呢? 对于Windows,Linux和Mac OS-s,这是同样的问题。
示例1。 我需要在具有管理员权限的cmd中进行一些工作。
from subprocess import run,Popen,call
run('net user Administrator /active: yes',shell=True)
run('pip install [some module]',shell=True) # or "powershell -command [some command]"
示例2。 我需要使用虚拟环境模块并进入所需的环境。
run(["workon","Universal"]
run("[some changes]")
有一个CMD模块,但它看起来与系统cmd-terminal隔离,就像您自己创建的CLI一样,并且用途不同。
请不要回答有关bash脚本,获取管理员权限的其他选项,或有关从cmd本身启动脚本的信息,例如“>“ python main.py”。正在谈论按顺序习惯性地执行CMD中的命令,以及Python如何做到这一点,保持cmd会话或不能这样做。
解决方法
我想您想保留获得的管理权限。 我不知道Windows,不要使用它。 但是,如果我在Linux上尝试类似的操作,则只需键入一次管理员密码:
$ python3
Python 3.8.2 (default,Jul 16 2020,14:00:26)
[GCC 9.3.0] on linux
Type "help","copyright","credits" or "license" for more information.
>>> import subprocess
>>> subprocess.run("sudo ls",shell=True)
[sudo] password for <me>:
a.txt b.txt
CompletedProcess(args='sudo ls',returncode=0)
>>> subprocess.run("sudo ls",shell=True)
a.txt b.txt
CompletedProcess(args='sudo ls',returncode=0)
>>>
但是您的实际问题是,是否可以“举行会议”。
也就是说,如果我对您的理解正确,请在外壳中执行一些命令,在这些命令完成后保持外壳运行,同时在脚本中执行其他操作以生成额外的命令,然后将这些新命令发送到相同的旧壳
是的。
您可以使用subprocess.Popen()
产生一个交互式shell(即该shell是要执行的命令)
并向其标准输入实际命令并从标准输出读取结果
这听起来很复杂:是的! 例如适当的错误处理意味着将shell返回的文本进行解析,然后比较一下是否为同步调用检查了返回代码。即使检测命令是否完成,也需要监视shell stdout / stderr
上显示的内容。您不想走异步道路。
对外部命令(例如subprocess.run()
)的同步调用非常简单。
我又尝试了一次,看来很有效!举行会议! 我用过:
Popen("workon Universal",shell=True) # 1
Popen("pip install termcolor") # 2 without shell=True
最后,在“通用”虚拟环境上安装了一个模块。我可以无休止地继续Popen(3),Popen(4)。 与run()相同。 使用“ shell = True”属性就可以了。 我想那是我寻找的解决方案。它对于所有命令和会话都是通用的。很难理解,在google或youtube上没有任何示例。 谢谢!