Python运行Shell命令

python 实现以管理员身份运行shell命令 python 实现运行shell命令 class CMD(object): """ 运行windows shell 命令 """ __instance__ = None def __new__(cls, *args, **kwargs): """ 实现单例模式 """ if cls.__instance__ is None: cls.__instance__ = super(). 阅读详情

现今,Python如此火爆,也不需进行多余的介绍(如果身为一个程序员,还不知道这个语言,那就要有危机感了),直入正题。本人也是Python新手一名,作为一名新手,当然选择新版本的Python啦,也就是Python3系列。刚开始,也不知道写点啥,不过光看文档也没啥用,所以就写了这个小程序(程序总代码也才70行,包括注释可怜)。程序功能也比较简单,就是在Python中运行Shell命令,简单地说就是接收用户输入shell命令,然后运行shell命令,并将shell命令的输出结果显示给用户。说起简单,做起来也不容易,身为菜鸟的我也折腾了将近1天。“麻雀虽小,五脏俱全”,程序虽然挺小,但也包含了几个有意思的小技术:子进程(Python3中新加入的功能)、多线程以及线程间通信等等。下面先介绍下相关基础知识(大神们如果无意间看到这篇文章,就直接略过基础知识吧,或者有时间的大神可以看看,有错的话希望能帮我这个菜鸟指出来,我也多学学吐舌头)。

基础知识

对于Python的语法知识,这里就不进行赘述了,主要讲一些关键技术,包括:子进程(Popen)、多线程(Thread)以及线程通信(Queue)

子进程(Popen)

在Python3中,提供了subprocess模块,其中提供了创建新的子进程的方法。subprocess模块中提供了两种方式进行子进程的创建和调用:通过模块内方法(例如,call、check_call方法)和通过创建Popen对象。前者也是通过Popen对象实现的方便的调用接口,Python官方文档中建议使用这些方法,但如果需要一些高级功能的话,则需要直接使用Popen对象进行子进程的创建。创建子进程之后,可以通过链接input/output/err管道,从而与子进程进行交互。我本人觉得Popen使用起来更自由方便些,所有就使用了Popen对象进行子进程的对象。当然,还有另一方面原因就是,写的过程中也不断搜索相关资料,Popen用的人比较多,可吸取的经验也就比较多。下面直接介绍Popen对象,对于前一种方法这里不进行介绍。
Popen类的构造方法如下:
class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=()) 
这个构造函数包含的参数颇多,所以解释清楚还需要多费些口舌。
args:一个字符串或者是是一个序列(seuquence,Python中的sequence结构包括list,tuple和range)。args传递的参数的第一项(不管是字符串,还是sequence)应该是可执行程序的名称。例如:
Popen(['/bin/sh', '-c', args[0], args[1], ...])
bufsize:定义了子程序的缓冲方式。0代表不进行缓冲,1代表缓冲一行,其他正整数代表了缓冲区的大小。如果设置为负数,那么是指使用系统默认缓冲大小。
executable:定义了需要运行的可执行程序。当在此处制定了可执行程序时,args中的第一项仍然代表程序的名称,但是可以和可执行程序的名字不同。这个参数很少使用,一般直接在args给出执行程序。
stdin,stdout,stderr:这三个参数指定了子程序的输入、输出、错误管道绑定。通过将这三个参数设置为标准管道或者文件,从而与子进程进行通信。其可以设置为:PIPE、DEVNULL、文件描述符、文件对象或者None。PIPE意味着会为子进程创建一个新的管道;DEVNULL意味着会使用os.devnull文件(代表没有实际设备的管道,虚拟设备管道);None意味着不会对输入输出等进行重定向。
preexec_fn:代表在运行子进程之间要运行的程序。仅适用于Unix操作系统。
close_fsd:此参数如果设置为Ture,那么除了0,1,2三个描述符,在子进程执行前都会被关闭(我也不明白啥意思)。在Unix系统上,默认值为True。在Windows操作系统上,当stdin/stdout/stderr为None时,此参数默认值为True,其他情况下默认值为False。此外,在Windows上如果此参数为True,那么子进程不会继承父进程呢过的任何句柄。需要注意的是,在Windows上,不能即重定向stdin/stdout/stderr,又将close_fds设置为True
shell:设置为True的时候,代表命令使用标准SHELL进行执行。
cwd:设置子进程的当前路径。需要注意的是,这个路径不影响可执行程序的路径,即不能将可执行的路径写为相对此路径。
env:子进程的环境变量,需为非None(不明白啥意思,使用的时候没有设置,也没有出错)。
universal_newline:如果设为True,那么stdin,stdout,stderr就在universal_newline模式下使用text stream。在此模式下,stdin,stdout和stderr使用locale.getpreferredencoding(False)返回的变法方式进行编码。stdin中的'\n'会被转换为os.linesep,stdout和stderr中行结束符会被转换为'\n'。
其他参数,文档中没介绍,这里也就不讲了,用的也不多。
Popen对象包含的主要方法包括:
Popen.poll():检查子进程是否结束了。如果结束了,返回非None值,否则返回None。
Popen.wait(timeout=None):等待子进程结束。
Popen.communicate(input=Node,timeout=None):与子进程进行交互,返回一个tuple(stdoutdata,stderrdata)
Popen.send_signal(signal):向子进程发送信号
Popen.terminate():在Posix OS上向子进程发送SIDTERM,在Win32平台上调用TerminateProcess()方法。
Popen.kill():在Posi OS上向子进程发送SIGKILL,在Windows上等同于terminate()方法

多线程

Python中对多线程支持由threading模块实现,该模块在是在底层模块_thread之上实现的。此模块中包含了很多模块方法,例如:active_count()返回进程子线程数,current_thread()返回当前线程等等。这里不一一介绍,主要介绍Thread对象。
Python中的实现多线程有两种方式:重写run方法或者向Thread对象传递一段可执行的代码。前者是通过继承的方式实现的,在继承Thread时,只能重写Thread的构造函数__init__()和run()函数。当线程对象创建之后,调用start()方法开始线程的执行。此后线程会一直执行直到run方法结束(正常结束)或者执行过程中产生没有处理的异常。可以通过is_alive()方法检查线程是否还在运行。Thread对象的构造方法如下:
Thread(group=None, target=None, name=None, args=(), kwargs={}, verbose=None, *, daemon=None) 
group:这个参数是为了将来实现ThreadGroup后使用的,现在应该设置为None。
target:代表了需要执行的代码段。一般情况下设置为一个函数名。
name:线程名。默认情况下,每个线程都会创建一个线程名:"Thread-N"
args:是一个tuple对象,用于向target传递参数。
kwargs:是一个dictionary对象,用来向target传递keyword参数。
vervose:是一个调试消息标志(不懂)。
daemon:标记次线程是否是后台线程。
主要成员方法:
start():开始线程
run():采用继承方式,需要重写的方法
join(timeout=None):阻塞次线程的执行,直到调用join方法的线程执行完成,或者timeout超时。
getName()/setName():获取/设置线程的名字
is_alive():线程是否在运行
isDaemon()/setDaemon():获取/设置线程后台

线程通信

Python中的queue模块提供了多生产-多消费者队列,从而可以用于适用此模式的线程间进行通信(还有其他通信机制,例如锁机制等,本文中没用到,也就不进行介绍)。在此模块中,提供三种不同类型的队列:FIFO队列、LILO队列以及Priority队列。构造函数依次为:
class queue.Queue(maxsize=0) 
class queue.LifoQueue(maxsize=0) 
class queue.PriorityQueue(maxsize=0) 
这三种队列都支持下面的方法:
qsize():获取队列的 大概(approximate)长度。需要注意的是,qsize()>0不意味着get()不会阻塞,同样qsize()<maxsize也不意味着puy()不会阻塞。
empty():获取队列是否为空。
full():获取队列是否为满
put(item,block=True,timeout=None):向队列中放入一个元素
put_nowait():等价于put(item,block=False)
get(block=True,timeout=None):从队列中取一个元素
get_nowait():等价于get(False)
task_done():通知队列,当前取出item已经处理完。
join():阻塞队列中所有item,直到队列中所有item都处理完。

程序模块

程序包括三个主要模块:主模块,子进程输出读取模块以及用户输入模块,说是模块,其实有的模块仅有几行代码,不过功能是相互独立的嘛,也就划分出来了。

输入模块

Python中提供了内置方法input()来提示用户进行输入,但应用到本文程序中,会有一个问题,即输入完shell成后,需要连按两次回车才能够显示shell命令执行的结结果,或者会多现实一个换行。如下图:


图中,输入hello命令后,会多出一个换行符,然后才显示输出。为了解决此问题,在网上找了个别人写的用来输入密码的方法,然后稍微改了改,修改为新的input方法,代码如下:
#input method
def pwd_input():  
    chars = [] 
    while True:
        try:
            newChar = msvcrt.getch().decode(encoding="utf-8")
        except:
            return input()
        if newChar in '\r\n': # 如果是换行,则输入结束             
             break 
        elif newChar == '\b': # 如果是退格,则删除密码末尾一位并且删除一个星号 
             if chars:  
                 del chars[-1] 
                 msvcrt.putch('\b'.encode(encoding='utf-8')) # 光标回退一格
                 msvcrt.putch( ' '.encode(encoding='utf-8')) # 输出一个空格覆盖原来的星号
                 msvcrt.putch('\b'.encode(encoding='utf-8')) # 光标回退一格准备接受新的输入                 
        else:
            chars.append(newChar)
            msvcrt.putch(newChar.encode(encoding='utf-8'))
    return (''.join(chars) )
代码中,使用了Python中提供的msvcrt方法,每次读取一个字符,然后如果字符是换行则直接返回;如果是回车则删除一个字符并将光标绘图,其他字符则直接显示(在密码输入的时候,用'*'代替newChar进行输出就行)。需要说明的是,之所以一开始需要捕获输入时的异常,是因为当在Python shell中执行,而不是在控制台执行时,会出现异常。这时候,直接用内置input()函数代替此函数。

子进程输出读取模块

为了读取子进程(也就是控制台子进程)的输出,程序中设置了两个线程,一个用来读取正常输出的消息,一个用来读取子进程的错误输出。线程执行的内容比较简单,即循环读取子进程输出流或者错误流,并将读取的内容放入到公共队列中。这里有个问题就是每次读取内容的多少,开始的时候使用每次读取一行(readline())但这样无法读取到输入提示的那一行(即C:\>这一行),只会在下次命令执行的时候才能读取到。所以采用了读取一定字节数的方式,再尝试了几种大小后,发现设置为64字节每次比较合理,出现显示错误的概率比较低。下面是这一模块的代码:
#function read data from of io object
def __reader(stream,q):
    while True:
        byte=stream.read(64)
        q.put(byte)
此函数包括两个参数,stream代表了需要读取的IO对象(本文中就是stdout和stderr),q代表了读取数据后放入的队列。

主模块

主模块负责整个程序的初始化、子进程、子线程等的创建。代码如下:
def cmd():
    cmdStack=[]# command stack
    #sharing queue
    q=Queue()
    #create shell subprocess
    p=Popen("cmd",stdin=PIPE,stdout=PIPE,stderr=PIPE,shell=True,cwd=os.environ['homepath'])
    #start reader
    outThread=Thread(target=__reader,kwargs={'stream':p.stdout,"q":q})
    errThread=Thread(target=__reader,kwargs={'stream':p.stderr,"q":q})
    outThread.setDaemon(True)
    errThread.setDaemon(True)
    outThread.start()
    errThread.start()
    #main loop
    while True:
        time.sleep(0.1)
        if p.poll()!=None:
            break
        #read messages
        output=b''
        while(q.qsize()>0):
           output+=q.get(False)
        output=output.decode('gb2312')
        #skip the command
        if len(cmdStack)>0:
            cmd=cmdStack[-1]
            start=output.find(cmd[0:-1])
            #print('<'+output+'><'+'<'+cmd[0:-1]+'>')
            if start!=-1:
                output=output[start+len(cmd):len(output)]
        print(output,end="")
        #read input
        cmd=pwd_input()
        cmdStack=[]
        cmdStack.append(cmd)
        cmd=cmd+'\n'
        p.stdin.write(cmd.encode(encoding='utf-8'))
首先创建了一个命令栈来存储执行过的命令,然后创建了一个公共队列,再然后创建了一个控制台子进程(用来执行SHELL命令)、两个控制台输出子线程,下面是循环读取SHELL输出的内容显示出来,然后再提示用户输入,并将输入的命令发送给SEHLL子进程。需要解释的主要代码包括以下几个部分:
1、SHELL子进程的创建
p=Popen("cmd",stdin=PIPE,stdout=PIPE,stderr=PIPE,shell=True,cwd=os.environ['homepath'])
上述语句创建了一个shell子进程,并将子进程的输入输出都设置为PIPE,也就是重定向为标准输入输出流。然后设置了子进程的执行路径为默认用户文件夹(在unix系统中使用'home'代替'homepath')。
2、子线程的创建
 #start reader
    outThread=Thread(target=__reader,kwargs={'stream':p.stdout,"q":q})
    errThread=Thread(target=__reader,kwargs={'stream':p.stderr,"q":q})
    outThread.setDaemon(True)
    errThread.setDaemon(True)
    outThread.start()
    errThread.start()
上面创建了两个进程,分别来读取标准输出流和标准错误流,然后并且设置为后台线程。之所以设置为后台线程,是因为这两个线程在读取输出的时候会被堵塞,即使子线程已经结束,此时如果不设置为后台线程,会导致主线程无法退出。设为后台线程后,主线程退出时会直接强制终止这两个线程。
3、读取子进程输出
 #read messages
        output=b''
        while(q.qsize()>0):
           output+=q.get(False)
        output=output.decode('gb2312')
        #skip the command
        if len(cmdStack)>0:
            cmd=cmdStack[-1]
            start=output.find(cmd[0:-1])
            #print('<'+output+'><'+'<'+cmd[0:-1]+'>')
            if start!=-1:
                output=output[start+len(cmd):len(output)]
        print(output,end="")
由于队列中的输出内容是字节数组的形式存储的,所以先进行字节数组的拼接,然后再进行解码,解码为字符串(不同平台采用不同字符集进行解码,这里针对Windows平台采用了gb2312)。由于命令在输入的时候已经显示了出来,所以应该跳过子进程输出中的命令,因此下面要查找命令,然后将此命令删除。最后将输出内容打印出来。
4、读取用户输入命令并执行
#read input
        cmd=pwd_input()
        cmdStack=[]
        cmdStack.append(cmd)
        cmd=cmd+'\n'
        p.stdin.write(cmd.encode(encoding='utf-8'))
上面读取用户的输入,并将输入,并在输入后面给放入一个换行符,通过标准输入流发送给子进程进行执行。这里,如果不加入一个换行符,则命令就不会执行。
5、其他说明
首先,在主循环中,每次需要休息0.1秒,从而放弃一段时间CPU,给子线程执行的时间。其次,通过Popen的poll()函数判断子进程是否结束执行(当输入exit命令时,子进程会结束执行),如果已经结束,则跳出循环,主程序结束执行。

运行效果


总结

总的来说,这个小程序实现了大部分命令的调用执行功能,但是有些功能还是没有实现的,主要是控制台相关的命令,例如:cls清空控制台。这些控制台控制相关的命令或者快捷键仍然没有实现。另外,解码方面也会有一些问题,有些命令会导致解码出错,无法显示输出结果等等。总的来说,还好吧,菜鸟练手还算凑合吧。要是有哪位大神做过或者有兴趣做个完整的控制台,希望能够予以赐教,我也好多学学。。。。 大笑

主要参考文章

Python官方文档





其他网上参考资源就不一一列举了

完整程序

from subprocess import *
import os
from queue import Queue
from threading import Thread
import time
import msvcrt
#input method
def pwd_input():  
    chars = [] 
    while True:
        try:
            newChar = msvcrt.getch().decode(encoding="utf-8")
        except:
            return input()
        if newChar in '\r\n': # 如果是换行,则输入结束             
             break 
        elif newChar == '\b': # 如果是退格,则删除密码末尾一位并且删除一个星号 
             if chars:  
                 del chars[-1] 
                 msvcrt.putch('\b'.encode(encoding='utf-8')) # 光标回退一格
                 msvcrt.putch( ' '.encode(encoding='utf-8')) # 输出一个空格覆盖原来的星号
                 msvcrt.putch('\b'.encode(encoding='utf-8')) # 光标回退一格准备接受新的输入                 
        elif newChar not in '\t':
            chars.append(newChar)
            msvcrt.putch(newChar.encode(encoding='utf-8'))
    return (''.join(chars) )
#function read data from of io object
def __reader(stream,q):
    while True:
        byte=stream.read(64)
        q.put(byte)
def cmd():
    cmdStack=[]# command stack
    #sharing queue
    q=Queue()
    #create shell subprocess
    p=Popen("cmd",stdin=PIPE,stdout=PIPE,stderr=PIPE,shell=True,cwd=os.environ['homepath'])
    #start reader
    outThread=Thread(target=__reader,kwargs={'stream':p.stdout,"q":q})
    errThread=Thread(target=__reader,kwargs={'stream':p.stderr,"q":q})
    outThread.setDaemon(True)
    errThread.setDaemon(True)
    outThread.start()
    errThread.start()
    #main loop
    while True:
        time.sleep(0.1)
        if p.poll()!=None:
            break
        #read messages
        output=b''
        while(q.qsize()>0):
           output+=q.get(False)
        output=output.decode('gb2312')
        #skip the command
        if len(cmdStack)>0:
            cmd=cmdStack[-1]
            start=output.find(cmd[0:-1])
            #print('<'+output+'><'+'<'+cmd[0:-1]+'>')
            if start!=-1:
                output=output[start+len(cmd):len(output)]
        print(output,end="")
        #read input
        cmd=pwd_input()
        cmdStack=[]
        cmdStack.append(cmd)
        cmd=cmd+'\n'
        p.stdin.write(cmd.encode(encoding='utf-8'))
if __name__=='__main__':
    cmd()
    print("\npython exitted")


74HC165级联踩坑实录:STM32读取32路开关状态,时序调试与常见问题排查 本文详细介绍了74HC165级联在STM32读取32路开关状态时的时序调试与常见问题排查。从硬件设计的PCB布局优化、电源噪声控制,到软件时序的精确调校和数据采集策略,提供了完整的解决方案。通过逻辑分析仪和示波器的高效使用,解决了信号延迟和干扰问题,最终实现了稳定可靠的32路信号读取。 阅读详情

相关推荐

从Stereo-seq原始数据到Seurat对象:华大空间转录组分析流程实战解析

本文详细解析了从Stereo-seq原始数据到Seurat对象的完整分析流程,重点解决华大空间转录组数据处理中的三大痛点:bin_size参数设置、批量处理内存管理及格式转换信息丢失。通过Python的stereopy库和R的SeuratDisk包,实现.gem到.h5ad再到.h5seurat的高效转换,为研究者提供了一套可复用的空间转录组分析解决方案。

weixin_30315723的博客 217

【Python系列】执行 Shell 命令的六种方法

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 2万+

【开关电源篇】整流及其滤波电路的工作原理和设计指南-超简单解读

半波整流是一种利用二极管的单向导通特性,将交流电转换为直流电的基础电路。它通过“切除”交流电的半个周期,仅保留另外半个周期来实现整流。1 开关电源超快学习思路点击跳转1.1开关电源的原理、结构和实物入门篇-超简单解读点击跳转1.2开关电源的EMI输入电路-超简单解读点击跳转倍压整流适用于需要高电压、小电流的特殊场合,通过电容充放电实现电压倍增。

2301_81299416的博客 2924

在Python里,执行Shell脚本的4种方法

方法一:os模块的system()方法 方法二:os模块的popen()方法 方法三:subprocess模块的call()方法 方法四:sh库

qq_29037259的博客 8769

银河麒麟桌面操作系统V10(SP1)ssh服务安装与配置

在国产化的大背景下,各种国产操作系统逐步进入运维人员的视野,ssh作为linux远程连接工具,是运维人员必需的工具之一。本文主要介绍在银河麒麟桌面操作系统V10(SP1)上安装和配置ssh服务。

zhengshaolin128的博客 7806

R语言 | 关联规则

关联规则(AssociationRules)是无监督的机器学习方法,用于知识发现,而非预测。 关联规则的学习器(learner)无需事先对训练数据进行打标签,因为无监督学习没有训练这个步骤。缺点是很难对关联规则学习器进行模型评估,一般都可以通过肉眼观测结果是否合理。 关联规则主要用来发现Pattern,最经典的应用是购物篮分析,当然其他类似于购物篮交易数据的案例也可以应用关联规则进行模式发现。

I think so I am 10万+

【Python 基础篇】Python中运行shell 命令方法

上面的执行例子可以看到,commands.getstatusoutput(cmd) 方法的执行结果是一个元组,第一个结果是状态码,第二个是输出结果的字符串格式,所以如果想要在提取执行结果的同时获取到执行的成功与否,则可以直接使用这个方法。os.popen() 方法执行命令之后会把成功执行的命令的结果以文件的形式返回,所以可以通过 read() 方法获取执行的结果,而如果执行失败,则文件为空,所以这个方法的适用场景是命令返回的结果比较多,需要进行提取结果的场景。方法一:os.system()

那么菜的博客 6865

uniapp [安卓苹果App端] - 在“安卓app/苹果app“平台端打包编译后,微信授权登录报错 login:fail [:-1]未能完成操作。(PGWXAPI错误-1。)错误码code:-10

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,微信授权登录,uniAppAPP端微信登录报错,出现微信确认登录界面后点击登录报错,BundleID,应用ID,微信登录,app微信一键登录,微信登录绑定点确定就出错,AppSecrect,login:fail[:-1]未能完成操作。(PGWXAPI错误-1。),"errCode":-100,"code":-100,在uniappmanifest.json配置了AppSecrect还是报错无

🏆 前端领域优质创作者 3764

python调用shell命令-「Python」6种python中执行shell命令方法

用Python调用Shell命令有如下几种方式:第一种:os.system("The command you want").这个调用相当直接,且是同步进行的,程序需要阻塞并等待返回。返回值是依赖于系统的,直接返回系统的调用返回值,所以windows和linux是不一样的。第二种:os.popen(command[,mode[,bufsize]])先给大家看个例子可以看出,pop...

weixin_37988176的博客 1039

29、机器人动力学中的欧拉 - 拉格朗日与哈密顿力学

本文深入探讨了机器人动力学中的欧拉-拉格朗日与哈密顿力学框架,涵盖向量流形上的辛结构、哈密顿方程的几何代数表述、泊松括号与积分不变量等核心概念。文章详细推导了机电系统中拉格朗日量与哈密顿量的构建方法,并结合牛顿-欧拉算法给出了局部哈密顿量和动量导数的迭代计算流程,适用于多关节机器人的动力学建模与控制设计。通过应用案例展示了理论在双关节机器人手臂中的实际运用,最后展望了其在优化控制、鲁棒性提升及智能融合方向的潜力。

perl8的博客 129

基于DeepFashion2数据集的服装检测系统:YOLOv11实现与UI界面开发

80万张高质量服装图片13个服装类别:短袖上衣、长袖上衣、短袖外套、长袖外套、背心、短裤、长裤、短裙、长裙、袜子、帽子、鞋、包包每张图片包含边界框、分割掩码、landmarks等标注多样化的场景:商业图片、街拍图片、消费者图片更高效的Backbone网络改进的特征金字塔网络(FPN)自适应训练样本分配策略更精确的损失函数以下是YOLOv11的模型定义:python复制下载# 模型参数self.nc = nc # 类别数。

YOLO 455

python执行shell并获取结果

本文详细介绍了python执行shell并获取结果的方法,介绍了如何使用Shell编程,给出了详细的代码示例。

m0_72958694的博客 2186

数仓建模—数据治理框架选型

全名主要亮点覆盖面最广:从数据治理、架构、质量、安全到元数据、主数据、数据仓库等等,几乎所有数据管理主题都能在DMBOK里找到相应章节。概念权威统一:帮助组织建立通用术语和知识基础,减少“部门之间说法不一致”的沟通成本。适用场景:如果你所在公司(或团队)正准备系统梳理数据管理的方方面面,DMBOK是一份非常全面的指导手册,尤其适合培养新人或为整个组织统一认知。需要注意:DMBOK偏“知识指引”,不直接提供成熟度模型或实施路线图。想要落地,还需要结合其他评估模型或项目管理方法。小案例举例:某。

2401_84052244的博客 4743

运行 Python 脚本——如何在终端中执行 Python Shell 命令

Shell 是另一个程序,其工作是接受输入并决定并执行所需的内核程序来完成工作并显示输出。但是非常复杂的大型 Python 程序是用扩展名为 .py 的文件编写的,通常称为 Python 脚本。在本文中,我们了解了 shell、终端以及如何使用 Python shell。Python Shell 为您提供了一个命令行界面,您可以使用它以交互方式直接向 Python 解释器指定命令。我们之前通过shell执行的所有命令,我们也可以写成脚本,通过这种方式运行。操作系统程序有两种类型,称为外壳程序和内核程序。

我的博客,不一样的自我表达 955

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

python 运行多条shell命令

使用py时可能需要连续运行多条shell 命令 1.# coding: UTF-8 import sys reload(sys) sys.setdefaultencoding('utf8')import subprocess import os import commands#os.system('cmd1 && cmd2') cmd1 = "cd ../" cmd2 = "ls" cmd = cm

xiojing的博客 2万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

python中运行shell命令

ow

juicyzx的专栏 394

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Python运行shell命令并捕获输出

在所有官方维护的 Python 版本中,最简单的方法是使用运行一个只接受参数作为输入的单个程序。它返回的结果与打印到stdout的结果完全相同。如果你需要向stdin写入输入,请跳到run或Popen部分。如果你想执行复杂的 shell 命令,请参阅此答案末尾关于shell=True的注释。函数在所有官方维护的 Python 版本中都可用。但对于更近的版本,有一个更灵活的方法可用。

liluo0815481的博客 899

python 运行shell命令 详解_详解python执行shell命令的三种方法

最近有个需求就是页面上执行shell命令,第一种 就是os.system,代码如下:os.system('cat /proc/cpuinfo')但是发现页面上打印的命令执行结果 0或者1,当然不满足需求了。尝试第二种方案 os.popen()代码如下:output = os.popen('cat /proc/cpuinfo')print output.read()通过 os.popen() 返回的...

weixin_39785723的博客 404

在Shell直接运行Python命令并显示

python -c 'print("Hi")' Hi

/dev/null 1164

python调用shell命令-Python怎么运行shell脚本

Python作为一门脚本语言,有时候需要与shell命令交互式使用,在Python中提供了很多的方法可以调用并执行shell脚本,本文介绍几个简单的方法。Python怎么运行shell脚本一、os.system(“command”)import osprint(os.system("touch a.txt"))print(os.system("ls -a")...

weixin_37988176的博客 378

shell脚本命令 运行python文件&python命令行运行python代码

单独的python文件运行的时候 报错: 在shell脚本中,运行shell脚本命令;在Python命令行中,运行Python代码。然而,“python hello.py”是一个脚本命令,不是python代码。 因此,退出python命令行,直接cd到hello.py所在目录,运行python hello.py,即可。 若是非要在python命令行中运...

aijian9025的博客 3409

python执行shell命令查看输出_从Python运行shell命令并捕获输出

文章目录我想编写一个函数来执行一个shell命令并返回它的输出 作为一个字符串 ,不管它是一个错误还是成功的消息。我只想得到和命令行一样的结果。什么样的代码可以做这样的事情?例如:def run_command(cmd):# ??????print run_command('mysqladmin create test -uroot -pmysqladmin12')# Should output ...

weixin_39578457的博客 728

python脚本运行命令_从Python脚本运行shell命令

我正在尝试从python脚本中运行一个shell命令,它需要做几件事1. shell命令是’hspice tran.deck>! tran.lis’2.在继续之前,脚本应该等待shell命令完成3.我需要检查命令的返回码和4.如果成功完成则捕获STDOUT,否则捕获STDERR我经历了子进程模块并尝试了一些事情,但无法找到完成上述所有操作的方法.– 使用subprocess.call()我可...

weixin_36442042的博客 357

python运行命令并且捕获输出_运行shell命令并捕获输出

这个问题的答案取决于您使用的Python版本。最简单的方法是使用subprocess.check_output职能:>>>subprocess.check_output(['ls','-l'])b'total0\n-rw-r--r--1memyselfstaff0Mar1411:04files\n'check_output运行一个仅以参数作为输入的程序...

weixin_39881802的博客 1028

Python 运行 shell 命令的一些方法

如果你需要创建或者删除文件/目录,检查文件是否存在或者改变权限等,你完全不需要使用操作系统的命令。模块是 Python 中一个更老的、更底层的模块,提供了与操作系统交互和执行文件系统操作的功能。一般来讲,最好是用 python 自带的函数或模块,而不是直接调用其他程序或者操作系统的命令。但是随着 python 的发展,越来越多面向对象的、更直观和易于使用的模块可以供大家使用。模块不是 python 的标准模块,它是一个第三方模块,在使用之前我们需要安装它。如果需要例如复制,移动,删除或创建文件,可以使用。

s_alted的博客 1190

python运行shell命令四种方法

这里介绍一下python执行shell命令的四种方法: 1、os模块中的os.system()这个函数来执行shell命令 1 2 3 >>> os.system('ls') anaconda-ks.cfg  install.log  install.log.syslog  send_sms_service.py 

6432
上一篇: C++简史
下一篇: Python Tips(Python小知识点)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值