python调用linux程序_python linux调用应用程序 - CSDN
精华内容
参与话题
  • Python下调用Linux的Shell命令

    万次阅读 2014-02-26 11:50:25
    那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法: 1. os 模块 1.1. os模块的exec方法族 Python的exec系统方法同Unix的exec系统调用是一致的。这些方法适用于在子进程中调用外部程序的...

    有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的。那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法:

    1. os 模块


    1.1. os模块的exec方法族

    Python的exec系统方法同Unix的exec系统调用是一致的。这些方法适用于在子进程中调用外部程序的情况,因为外部程序会替换当前进程的代码,不会返回。( 这个看了点 help(os)  --> search "exec" 的相关介绍,但是没太搞明白咋使用)


    1.2. os模块的system方法

    system方法会创建子进程运行外部程序,方法只返回外部程序的运行结果。这个方法比较适用于外部程序没有输出结果的情况。

    1. >>> import os  
    2. >>> os.system("echo \"Hello World\"")   # 直接使用os.system调用一个echo命令  
    3. Hello World         ——————> 打印命令结果  
    4. 0                   ——————> What's this ? 返回值?  
    5. >>> val = os.system("ls -al | grep \"log\" ")   # 使用val接收返回值  
    6. -rw-r--r--  1 root       root       6030829 Dec 31 15:14 log    ——————> 此时只打印了命令结果  
    7. >>> print val             
    8. 0                   ——————> 注意,此时命令正常运行时,返回值是0  
    9. >>> val = os.system("ls -al | grep \"log1\" ")  
    10. >>> print val         
    11. 256                 ——————> 使用os.system调用一个没有返回结果的命令,返回值为256~  
    12. >>>   

    注意:上面说了,此方法脂肪会外部程序的结果,也就是os.system的结果,所以如果你想接收命令的返回值,接着向下看~


    1.3. os模块的popen方法

    当需要得到外部程序的输出结果时,本方法非常有用,返回一个类文件对象,调用该对象的read()或readlines()方法可以读取输出内容。比如使用urllib调用Web API时,需要对得到的数据进行处理。os.popen(cmd) 要得到命令的输出内容,只需再调用下read()或readlines()等 如a=os.popen(cmd).read()

    1. >>> os.popen('ls -lt')                  # 调用os.popen(cmd)并不能得到我们想要的结果  
    2. <open file 'ls -lt ', mode 'r' at 0xb7585ee8>  
    3. >>> print os.popen('ls -lt').read()     # 调用read()方法可以得到命令的结果  
    4. total 6064  
    5. -rwxr-xr-x 1 long       long            23 Jan  5 21:00 hello.sh  
    6. -rw-r--r-- 1 long       long           147 Jan  5 20:26 Makefile  
    7. drwxr-xr-x 3 long       long          4096 Jan  2 19:37 test  
    8. -rw-r--r-- 1 root       root       6030829 Dec 31 15:14 log  
    9. drwxr-xr-x 2 long       long          4096 Dec 28 09:36 pip_build_long  
    10. drwx------ 2 Debian-gdm Debian-gdm    4096 Dec 23 19:08 pulse-gylJ5EL24GU9  
    11. drwx------ 2 long       long          4096 Jan  1  1970 orbit-long  
    12. >>> val = os.popen('ls -lt').read()     # 使用变量可以接收命令返回值  
    13. >>> if "log" in val:                    # 我们可以使用in来判断返回值中有木有一个字符串  
    14. ...     print "Haha,there is the log"  
    15. ... else:  
    16. ...     print "No,not happy"  
    17. ...  
    18. Haha,there is the log  


    2. commands 模块


    使用commands模块的getoutput方法,这种方法同popend的区别在于popen返回的是一个类文件对象,而本方法将外部程序的输出结果当作字符串返回,很多情况下用起来要更方便些。
    主要方法:  

    *   commands.getstatusoutput(cmd)         返回(status, output)
    *   commands.getoutput(cmd)                   只返回输出结果
    *   commands.getstatus(file)                     返回ls -ld file的执行结果字符串,调用了getoutput,不建议使用此方法

    1. long@zhouyl:/tmp/tests$ python  
    2. Python 2.7.3 (default, Jan  2 201316:53:07)   
    3. [GCC 4.7.2] on linux2  
    4. Type "help""copyright""credits" or "license" for more information.  
    5. >>> import commands  
    6. >>> commands.getstatusoutput('ls -lt')      # 返回(status, output)  
    7. (0'total 5900\n-rwxr-xr-x 1 long long      23 Jan  5 21:34 hello.sh\n-rw-r--r-- 1 long long     147 Jan  5 21:34 Makefile\n-rw-r--r-- 1 long long 6030829 Jan  5 21:34 log')  
    8. >>> commands.getoutput('ls -lt')            # 返回命令的输出结果(貌似和Shell命令的输出格式不同哈~)  
    9. 'total 5900\n-rwxr-xr-x 1 long long      23 Jan  5 21:34 hello.sh\n-rw-r--r-- 1 long long     147 Jan  5 21:34 Makefile\n-rw-r--r-- 1 long long 6030829 Jan  5 21:34 log'  
    10. >>> commands.getstatus('log')               # 调用commands.getoutput中的命令对'log'文件进行相同的操作  
    11. '-rw-r--r-- 1 long long 6030829 Jan  5 21:34 log'  
    12. >>>   


    3. subprocess模块


    根据Python官方文档说明,subprocess模块用于取代上面这些模块。有一个用Python实现的并行ssh工具—mssh,代码很简短,不过很有意思,它在线程中调用subprocess启动子进程来干活。
    1. >>> from subprocess import call  
    2. >>> call(["ls""-l"])  

    subprocess与system相比的优势是它更灵活(你可以得到标准输出,标准错误,“真正”的状态代码,更好的错误处理,等..)。我认为使用os.system已过时,或即将过时。

    4. 众方法的比较以及总结

    4.1. 关于 os.system 

    os.system("some_command with args")将命令以及参数传递给你的系统shell,这很好,因为你可以用这种方法同时运行多个命令并且可以设置管道以及输入输出重定向。比如:
    os.system("some_command < input_file | another_command > output_file")
    然而,虽然这很方便,但是你需要手动处理shell字符的转义,比如空格等。此外,这也只能让你运行简单的shell命令而且不能运行外部程序。

    4.2. 关于os.popen

    使用stream = os.popen("some_command with args")也能做与os.system一样的事,与os.system不同的是os.popen会返回一个类文件对象,使用它来访问标准输入、输出。

    4.3. 关于subprocess.popen

    subprocess模块的Popen类,意图作为os.popen的替代,但是因为其很全面所以比os.popen要显得稍微复杂
    比如你可以使用  print Popen("echo Hello World", stdout=PIPE, shell=True).stdout.read()  来替代  print os.popen("echo Hello World").read()。但是相比之下它使用一个统一的类包括4中不同的popen函数还是不错的。

    4.4. 关于subprocess.call

    subprocess模块的call函数。它基本上就像Popen类并都使用相同的参数,但是它只简单的等待命令完成并给你返回代码。比如:
    return_code = subprocess.call("echo Hello World", shell=True)


    os模块中还有C中那样的fork/exec/spawn函数,但是我不建议直接使用它们。
    subprocess可能更加适合你。


    ===========================================
    [1] http://demi-panda.com/2013/01/25/python-shell-command/index.html
    [2] http://m.blog.csdn.net/blog/overstack/9295995
    [3] http://blog.csdn.net/swiftshow/article/details/7755543

    下面是对于文中所涉及的内容的python官方文档:

    [4] http://docs.python.org/library/subprocess.html#replacing-older-functions-with-the-subprocess-module       -- 关于使用subprocess 替代老的方法

    [5] http://docs.python.org/lib/os-process.html     -- os的exec方法族以及system方法

    [6] http://docs.python.org/lib/os-newstreams.html    -- os的popen方法

    [7] http://docs.python.org/lib/node528.html    -- os的subprocess介绍


    展开全文
  • python调用shell命令

    万次阅读 2019-05-21 20:41:27
    python程序调用shell命令 1. os.system(command) 此函数会启动子进程,在子进程中执行command,并返回command命令执行完毕后的退出状态,如果command有执行内容,会在标准输出显示。这实际上是使用C标准库函数...

    在python程序中调用shell命令

    1. os.system(command)

    此函数会启动子进程,在子进程中执行command,并返回command命令执行完毕后的退出状态,如果command有执行内容,会在标准输出显示。这实际上是使用C标准库函数system()实现的。

    缺点:这个函数在执行command命令时需要重新打开一个终端,并且无法保存command命令的执行结果。
    system方法会创建子进程运行外部程序,方法只返回外部程序的运行结果。这个方法比较适用于外部程序没有输出结果的情况。

    import os 
     os.system("echo \"Hello World\"")  # 直接使用os.system调用一个echo命令 
     Hello World     ——————> 打印命令结果 
    0          ——————> What's this ? 返回值? 
    >>> val = os.system("ls -al | grep \"log\" ")  # 使用val接收返回值 
    -rw-r--r-- 1 root    root    6030829 Dec 31 15:14 log  ——————> 此时只打印了命令结果 
    >>> print val       
    0          ——————> 注意,此时命令正常运行时,返回值是0
    >>> val = os.system("ls -al | grep \"log1\" ") 
    >>> print val     
    256         ——————> 使用os.system调用一个没有返回结果的命令,返回值为256~ 
    

    实例:os.system(‘ls -l *’)

    2. os.popen(command,mode)

    打开一个与command进程之间的管道。这个函数的返回值是一个文件对象,可以读或者写(由mode决定,mode默认是’r’)。如果mode为’r’,可以使用此函数的返回值调用read()来获取command命令的执行结果。

    os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容。实际使用时视需求情况而选择。

    • 当需要得到外部程序的输出结果时,本方法非常有用,返回一个类文件对象,调用该对象的read()或readlines()方法可以读取输出内容。比如使用urllib调用Web API时,需要对得到的数据进行处理。os.popen(cmd) 要得到命令的输出内容,只需再调用下read()或readlines()等 如a=os.popen(cmd).read()
    >>> os.popen('ls -lt')         # 调用os.popen(cmd)并不能得到我们想要的结果 
    <open file 'ls -lt ', mode 'r' at 0xb7585ee8> 
    >>> print os.popen('ls -lt').read()   # 调用read()方法可以得到命令的结果 
    total 6064
    -rwxr-xr-x 1 long    long      23 Jan 5 21:00 hello.sh 
    -rw-r--r-- 1 long    long      147 Jan 5 20:26 Makefile 
    drwxr-xr-x 3 long    long     4096 Jan 2 19:37 test 
    -rw-r--r-- 1 root    root    6030829 Dec 31 15:14 log 
    drwxr-xr-x 2 long    long     4096 Dec 28 09:36 pip_build_long 
    drwx------ 2 Debian-gdm Debian-gdm  4096 Dec 23 19:08 pulse-gylJ5EL24GU9 
    drwx------ 2 long    long     4096 Jan 1 1970 orbit-long
    >>> val = os.popen('ls -lt').read()   # 使用变量可以接收命令返回值 
    >>> if "log" in val:          # 我们可以使用in来判断返回值中有木有一个字符串 
    ...   print "Haha,there is the log"
    ... else: 
    ...   print "No,not happy"
    ... 
    Haha,there is the log 
    

    实例:tmp = os.popen(‘ls -l *’).readlines()

    3. commands.getstatusoutput(command)

    使用os.popen()函数执行command命令并返回一个元组(status,output),分别表示command命令执行的返回状态和执行结果。对command的执行实际上是按照{command;} 2>&1的方式,所以output中包含控制台输出信息或者错误信息。output中不包含尾部的换行符。
    使用commands模块的getoutput方法,这种方法同popend的区别在于popen返回的是一个类文件对象,而本方法将外部程序的输出结果当作字符串返回,很多情况下用起来要更方便些。

    4. subprocess模块

    根据Python官方文档说明,subprocess模块用于取代上面这些模块。有一个用Python实现的并行ssh工具—mssh,代码很简短,不过很有意思,它在线程中调用subprocess启动子进程来干活。

     args="ls -l"
     p=subprocess.Popen(args,shell=True)
    

    subprocess与system相比的优势是它更灵活(你可以得到标准输出,标准错误,“真正”的状态代码,更好的错误处理,等…)。其中的call()完全替代了system(),而popen()被更为丰富的Popen类替代;

    总结:推荐使用subprocess.run() 来解决一般问题。

    subprocess.run()、subprocess.call()、subprocess.check_call()、subprocess.check_output()都是通过对subprocess.Popen的封装来实现的高级函数,因此如果我们需要更复杂功能时,可以通过subprocess.Popen来完成。run默认不会返回输出,只返回命令和执行状态。
    Python之系统交互(subprocess)
    举例讲解Linux系统下Python调用系统Shell的方法

    展开全文
  • python 调用Linux系统命令笔记

    千次阅读 2012-07-17 15:36:34
    在做项目中的时候用到的几个技术点: 1.cmdInfo = commands.getstatusoutput("useradd -g ftp -d %s -s /sbin/nologin %s" %(ftpDir, ftpUser))  返回命令行执行结果 元组() 2.添加系统用户 ...

    在做项目中的时候用到的几个技术点:

    1.cmdInfo = commands.getstatusoutput("useradd -g ftp -d %s -s /sbin/nologin %s" %(ftpDir, ftpUser))

       返回命令行执行结果 元组()

    2.添加系统用户

    os.system("echo '%s' | passwd --stdin %s" %(ftpPass, ftpUser))

    3.添加samab用户

    smbStr = r"(echo %s; echo %s) | smbpasswd -s -a %s" %(smbPass, smbPass, smbUser)

    在做添加smb用户密码时想到用pexpect交互式模式,但是有点复杂,在此记录下

    #!/usr/bin/env python
    
    import pexpect
    # 即将 ftp 所要登录的远程主机的域名
    ipAddress = 'develperWorks.ibm.com'
    # 登录用户名
    loginName = 'root'
    # 用户名密码
    loginPassword = 'passw0rd'
    
    # 拼凑 ftp 命令
    cmd = 'ftp ' + ipAddress
    # 利用 ftp 命令作为 spawn 类构造函数的参数,生成一个 spawn 类的对象
    child = pexpect.spawn(cmd)
    # 期望具有提示输入用户名的字符出现
    index = child.expect(["(?i)name", "(?i)Unknown host", pexpect.EOF, pexpect.TIMEOUT])
    # 匹配到了 "(?i)name",表明接下来要输入用户名
    if ( index == 0 ):
        # 发送登录用户名 + 换行符给子程序.
        child.sendline(loginName)
        # 期望 "(?i)password" 具有提示输入密码的字符出现.
        index = child.expect(["(?i)password", pexpect.EOF, pexpect.TIMEOUT])
        # 匹配到了 pexpect.EOF 或 pexpect.TIMEOUT,表示超时或者 EOF,程序打印提示信息并退出.
        if (index != 0):
            print "ftp login failed"
            child.close(force=True)
        # 匹配到了密码提示符,发送密码 + 换行符给子程序.
        child.sendline(loginPassword)
        # 期望登录成功后,提示符 "ftp>" 字符出现.
        index = child.expect( ['ftp>', 'Login incorrect', 'Service not available',
        pexpect.EOF, pexpect.TIMEOUT])
        # 匹配到了 'ftp>',登录成功.
        if (index == 0):
            print 'Congratulations! ftp login correct!'
            # 发送 'bin'+ 换行符给子程序,表示接下来使用二进制模式来传输文件.
            child.sendline("bin")
            print 'getting a file...'
            # 向子程序发送下载文件 rmall 的命令.
            child.sendline("get rmall")
            # 期望下载成功后,出现 'Transfer complete.*ftp>',其实下载成功后,
            # 会出现以下类似于以下的提示信息:
            #    200 PORT command successful.
            #    150 Opening data connection for rmall (548 bytes).
            #    226 Transfer complete.
            #    548 bytes received in 0.00019 seconds (2.8e+03 Kbytes/s)
            # 所以直接用正则表达式 '.*' 将 'Transfer complete' 和提示符 'ftp>' 之间的字符全省去.
            index = child.expect( ['Transfer complete.*ftp>', pexpect.EOF, pexpect.TIMEOUT] )
            # 匹配到了 pexpect.EOF 或 pexpect.TIMEOUT,表示超时或者 EOF,程序打印提示信息并退出.
            if (index != 0):
                print "failed to get the file"
                child.close(force=True)
            # 匹配到了 'Transfer complete.*ftp>',表明下载文件成功,打印成功信息,并输入 'bye',结束 ftp session.
            print 'successfully received the file'
            child.sendline("bye")
        # 用户名或密码不对,会先出现 'Login incorrect',然后仍会出现 'ftp>',但是 pexpect 是最小匹配,不是贪婪匹配,
        # 所以如果用户名或密码不对,会匹配到 'Login incorrect',而不是 'ftp>',然后程序打印提示信息并退出.
        elif (index == 1):
            print "You entered an invalid login name or password. Program quits!"
            child.close(force=True)
        # 匹配到了 'Service not available',一般表明 421 Service not available, remote server has
        # closed connection,程序打印提示信息并退出.
        # 匹配到了 pexpect.EOF 或 pexpect.TIMEOUT,表示超时或者 EOF,程序打印提示信息并退出.
        else:
            print "ftp login failed! index = " + index
            child.close(force=True)
    
    
    # 匹配到了 "(?i)Unknown host",表示 server 地址不对,程序打印提示信息并退出
    elif index == 1 :
        print "ftp login failed, due to unknown host"
        child.close(force=True)
    # 匹配到了 pexpect.EOF 或 pexpect.TIMEOUT,表示超时或者 EOF,程序打印提示信息并退出
    else:
        print "ftp login failed, due to TIMEOUT or EOF"
        child.close(force=True)


    展开全文
  • python中执行linux命令(调用linux命令)

    万次阅读 2017-06-19 10:39:40
    #传参调用exe程序(解决相对路径,觉得路径问题),等待exe进程结束,此程序才结束。 # -*- coding: utf-8-*- import os, os.path, sys import win32process, win32event exe_path = sys.argv[1] exe_file = sys....
    #传参调用exe程序(解决相对路径,觉得路径问题),等待exe进程结束,此程序才结束。
    
    # -*- coding: utf-8-*-
    
    import os, os.path, sys
    import win32process, win32event
    
    exe_path = sys.argv[1]
    exe_file = sys.argv[2]
    
    #os.chdir(exe_path)
    
    try :
            handle = win32process.CreateProcess(os.path.join(exe_path, exe_file),
                    '', None, None, 0,
                    win32process.CREATE_NO_WINDOW,
                    None ,
                    exe_path,
                    win32process.STARTUPINFO())
            running = True       
    except Exception, e:
            print "Create Error!"
            handle = None
            running = False
    
    while running :
            rc = win32event.WaitForSingleObject(handle[0], 1000)
            if rc == win32event.WAIT_OBJECT_0:
                    running = False
    #end while
    print "GoodBye"
     

    #需要用的模块:pywin32-214.win32-py2.5.exe 

    把改程序做成exe程序,就可以任何地方调用了(windows系统下)。


    ===========================================================================

    两者均需 import os

    (1) os.system

    # 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息

    system(command) -> exit_status
    Execute the command (a string) in a subshell.

    # 如果再命令行下执行,结果直接打印出来

    >>> os.system('ls')
    04101419778.CHM   bash      document    media      py-django   video
    11.wmv            books     downloads   Pictures  python
    all-20061022      Desktop   Examples    project    tools

    (2) os.popen

    # 该方法不但执行命令还返回执行后的信息对象

    popen(command [, mode='r' [, bufsize]]) -> pipe
    Open a pipe to/from a command returning a file object.

    ---------------------------------------------------------------------

    p=os.popen('ssh 10.3.16.121 ps aux | grep MySQL')
    x=p.read()
    print x
    p.close()

    例如:

    >>>tmp = os.popen('ls *.py').readlines()
    >>>tmp
    Out[21]:
    ['dump_db_pickle.py ',
    'dump_db_pickle_recs.py ',
    'dump_db_shelve.py ',
    'initdata.py ',
    '__init__.py ',
    'make_db_pickle.py ',
    'make_db_pickle_recs.py ',
    'make_db_shelve.py ',
    'peopleinteract_query.py ',
    'reader.py ',
    'testargv.py ',
    'teststreams.py ',
    'update_db_pickle.py ',
    'writer.py ']

    好处在于:将返回的结果赋于一变量,便于程序的处理。

    (3)  使用模块subprocess

    >>> import subprocess
    >>> subprocess.call (["cmd", "arg1", "arg2"],shell=True)

    获取返回和输出:

    import subprocess
    p = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    for line in p.stdout.readlines():
        print line,
    retval = p.wait()
    (4)  使用模块commands模块

     import os
    
    import commands
    
    方法1)使用commands.getstatusoutput方法,这是一个神奇的方法,能够直接得到返回值以及命令输出。官网说明:http://docs.python.org/library/commands.html
    
            status,output=commands.getstatusoutput(cmdstr)
    
    ***********************下面代码是判断返回值**********************************************************
            if False==os.WIFEXITED(status) or 0!=os.WEXITSTATUS(status):                       
                self.logging.info("check port false. port [%s] has not been listened. cmdstr: [%s]", port, cmdstr)                                                        
                return False 
            self.logging.info("check port true. port [%s] has been listened. cmdstr: [%s]", cmdstr) 
            return True       
    
    status是返回值,ouput是输出
    
    但是这种方法存在一个问题,就是如果命令中(cmdstr)含有&符号,这个命令会出错,此时,需要使用os.system方法

    >>> import commands
    >>> dir(commands)
    ['__all__', '__builtins__', '__doc__', '__file__', '__name__', 'getoutput', 'getstatus', 'getstatusoutput','mk2arg', 'mkarg']
    >>> commands.getoutput("date")
    'Wed Jun 10 19:39:57 CST 2009'
    >>>
    >>> commands.getstatusoutput("date")
    (0, 'Wed Jun 10 19:40:41 CST 2009')
    注意: 当执行命令的参数或者返回中包含了中文文字,那么建议使用subprocess,如果使用os.popen则会出现下面的错误:
    Traceback (most recent call last):
    File "./test1.py", line 56, in <module>
      main()
    File "./test1.py", line 45, in main
      fax.sendFax()
    File "./mailfax/Fax.py", line 13, in sendFax
      os.popen(cmd)
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 46-52: ordinal not in range(128)
    (5)使用模块pbs

    >>> import pbs
    
    >>> pbs.pwd()
    
    /var/log
    
    >>> pbs.hostname()
    
    waf-dev
    
    >>> pbs.ifconfig('eth1')
    
    eth1      Link encap:以太网  硬件地址 00:50:56:94:db:20
    
              inet 地址:182.168.1.1  广播:192.2.255.255  掩码:255.255.0.0
    
              inet6 地址: fe80::250:56ff:fe94:db20/64 Scope:Link
    
              UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
    
              接收数据包:3229133 错误:0 丢弃:0 过载:0 帧数:0
    
              发送数据包:2215454 错误:0 丢弃:0 过载:0 载波:0
    
              碰撞:0 发送队列长度:1000
    
              接收字节:452148544 (452.1 MB)  发送字节:1095951536 (1.0 GB)
    
    >>> pbs.ping('g.cn', c=3)
    
    PING g.cn (203.208.45.208) 56(84) bytes of data.
    
    64 bytes from 203.208.45.208: icmp_seq=1 ttl=48 time=13.1 ms
    
    64 bytes from 203.208.45.208: icmp_seq=2 ttl=48 time=12.4 ms
    
    64 bytes from 203.208.45.208: icmp_seq=3 ttl=48 time=11.6 ms
    
    --- g.cn ping statistics ---
    
    3 packets transmitted, 3 received, 0% packet loss, time 2003ms
    
    rtt min/avg/max/mdev = 11.675/12.430/13.125/0.593 ms

    ==========================================================================================


    1.1   os.system(command)

    在一个子shell中运行command命令,并返回command命令执行完毕后的退出状态。这实际上是使用C标准库函数system()实现的。这个函数在执行command命令时需要重新打开一个终端,并且无法保存command命令的执行结果。

    1.2   os.popen(command,mode)

    打开一个与command进程之间的管道。这个函数的返回值是一个文件对象,可以读或者写(由mode决定,mode默认是’r')。如果mode为’r',可以使用此函数的返回值调用read()来获取command命令的执行结果。

    os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容。实际使用时视需求情况而选择。

    1.3   commands.getstatusoutput(command)

      使用commands.getstatusoutput函数执行command命令并返回一个元组(status,output),分别表示command命令执行的返回状态和执行结果。对command的执行实际上是按照{command;} 2>&1的方式,所以output中包含控制台输出信息或者错误信息。output中不包含尾部的换行符。

    实例:

    >>>import commands

    >>> status, output = commands.getstatusoutput('ls -l')

    使用subprocess模块可以创建新的进程,可以与新建进程的输入/输出/错误管道连通,并可以获得新建进程执行的返回状态。使用subprocess模块的目的是替代os.system()、os.popen*()、commands.*等旧的函数或模块。

    2.1   subprocess.call(["some_command","some_argument","another_argument_or_path"])

    subprocess.call(command,shell=True)

    实例:

    handle = subprocess.call('ls -l', shell=True)

    2.2   subprocess.Popen(command, shell=True)

    如果command不是一个可执行文件,shell=True不可省。

      最简单的方法是使用class subprocess.Popen(command,shell=True)。Popen类有Popen.stdin,Popen.stdout,Popen.stderr三个有用的属性,可以实现与子进程的通信。 【linux公社 http://www.linuxidc.com 】

    将调用shell的结果赋值给python变量

    handle = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)

    实例:

    handle = subprocess.Popen('ls -l', stdout=subprocess.PIPE, shell=True)

    handle = subprocess.Popen(['ls','-l'], stdout=subprocess.PIPE, shell=True)

    handle = subprocess.Popen(args='ls -l', stdout=subprocess.PIPE, shell=True)

    print handle.stdout.read()

    print handle.communicate()[0]



    展开全文
  • python调用linux命令

    2019-10-17 11:51:38
    welcome to my blog ...python官方文档说, os.system(command)会在一个子进程中执行command, 所以没法更改当前主程序的环境变量 换句话说, os.system(command)执行command的效果相当于重新打开一个终端, ...
  • Python调用(运行)外部程序

    万次阅读 2013-04-10 11:39:24
    Python调用(运行)外部程序 在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其他脚本,或者程序提供的功能,而不必再次编写实现该功能的代码。为了更好地控制运行的进程,可以...
  • Python3 执行Linux Bash命令

    万次阅读 2017-08-19 10:59:58
    和之前C++执行Linux Bash命令 一样,Python依然支持system调用和popen()函数来执行linux bash命令。方法一:system调用#仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 import os os.system('ls')...
  • 安卓完美使用python

    千次阅读 2018-07-14 16:02:54
    安卓完美使用python开发 所需linux环境搭建软件 Linux Deploy JuiceSSH 两个比较好用的代码编辑器 QuickEdit(推荐使用这个) DroidEdit 下载地址: ...
  • python : html 调用本地python程序

    万次阅读 2018-03-03 18:12:01
    python : html 调用本地 python 程序
  • Ubuntu 命令行中用 GPU 运行 Python 程序

    千次阅读 2018-05-22 10:58:02
    在终端执行 Python 程序时可以使用下面的命令: CUDA_VISIBLE_DEVICES=1 python your_file.py 这样在跑你的网络之前,告诉程序只能看到1号GPU,其他的GPU它不可见 可用的形式如下: CUDA_VISIBLE_DEVICES=1 # ...
  • python中3种调用可执行文件.exe的方法

    万次阅读 热门讨论 2018-07-04 20:41:23
    方法一、os.system() 会保存可执行程序中的打印值和主函数的返回值,且会将执行过程中要打印的内容打印出来import os main = "project1.exe" r_v = os.system(main)  print (r_v )方法二、commands....
  • Linux上如何测试、运行python脚本

    万次阅读 2017-06-02 18:37:13
    有两种方式:1、直接使用python xxxx.py执行。其中python可以写成python的绝对路径。使用which python进行查询。2、在文件的头部(第一行)写上#!/usr/bin/python2.7,这个...因为在linux中,python啊shell这些程序都是
  • python程序调用另一个py文件

    万次阅读 2019-05-02 18:33:54
    调用函数: A.py文件: def add(x,y): print('和为:%d'%(x+y)) B.py文件: import A A.add(1,2) 或 from A import add add(1,2) 调用类: A.py文件: ...
  • python脚本在linux上运行的两种方式

    万次阅读 2018-08-22 14:41:56
    1、直接使用python xxxx.py执行。其中python可以写成python的绝对路径。使用which python进行查询。   2、在文件的头部(第一行)写上#!/usr/bin/python2.7,这个地方使用python的绝对路径,就是上面用which ...
  • linux下执行python脚本的两种方式

    万次阅读 2018-10-11 10:02:45
    1、直接使用python xxxx.py执行。其中python可以写成python的绝对路径。使用which python进行查询。 2、在文件的头部(第一行)写上#!/usr/bin/python2.7,这个地方使用python的绝对路径,就是上面用which python...
  • python调用java完整教程

    万次阅读 2018-10-11 21:40:52
    由于 python 本身为脚本语言,且经常存在调用第三方库的情况,有的时候用 java 调用 python 不如用 python 调用 java 方便。下面就整理一下在 python 调用 java 过程中需要哪些操作。(默认是 linux 的 Ubuntu 上调...
  • linux终端(terminal)中执行python文件

    万次阅读 多人点赞 2017-03-06 09:48:58
    linux终端(terminal)中执行python文件
  • Linux终端中的操作均是使用命令行来进行的。因此,对于小白来说,熟记几个基本的命令行和使用方法能够较快的在Linux命令行环境中将python用起来。
  • python3执行linux命令

    千次阅读 2017-08-31 09:47:17
    本文主要实现在linux环境下通过python3执行linux命令
  • 两步解决python调用Matlab的脚本和函数文件

    万次阅读 多人点赞 2020-08-09 21:52:37
    谢谢~http://blog.csdn.net/sunny_xsc1994/article/details/79254196很早之前写了一篇《python调用matlab环境配置》有关通过mlab实现python调用matlab的配置,但是只在windows下成功了,在Linux下一直没成功,后来...
1 2 3 4 5 ... 20
收藏数 103,231
精华内容 41,292
关键字:

python调用linux程序