是否可以将Python脚本中的文本作为可执行命令输出到终端?

时间:2014-07-09 20:23:58

标签: python terminal output

具体来说,我想要一个Python脚本,它接受来自用户的字符串并将该字符串解释为终端中的命令。换句话说,我的脚本应该可以按如下方式使用:

python testScript.py "command -arg1 -arg2 -arg3"

输出应如下:

command -arg1 -arg2 -arg3

执行带有3个参数的命令:arg1,arg2和arg3。

即,

python testScript.py "ls -lah"

输出当前目录的权限。

同样,

python testScript.py "/testarea ls -lah"

将输出目录的权限," / testarea"

任何建议或模块?

4 个答案:

答案 0 :(得分:1)

运行任意用户输入通常被认为是一个坏主意©,但如果你真的想这样做:

#testScript.py
import sys, os

if __name__ == "__main__":
    os.system(" ".join(sys.argv[1:]))

答案 1 :(得分:1)

最强大的方法是使用subprocess模块。看看所有可能的选项。

https://docs.python.org/2/library/subprocess.html

答案 2 :(得分:1)

...不确定

最基本的方法是使用os:

import os, sys

os.system(sys.argv[1])

如果你想更好地控制通话,请看看 但是子进程模块。使用该模块,您也可以这样做 如上所述,但做了很多,比如捕获输出 命令并在程序中使用它

答案 3 :(得分:1)

这是我想出的最佳答案。我赞成任何曾说过使用subprocess模块或者有一个很好的替代方案的人。

import subprocess, threading

class Command(object):
    def __init__(self, cmd):
        self.cmd = cmd
        self.process = None

    def run(self, timeout):
        def target():
            print 'Thread started'
            self.process = subprocess.Popen(self.cmd, shell=True)
            self.process.communicate()
            print 'Thread finished'

        thread = threading.Thread(target=target)
        thread.start()

        thread.join(timeout)
        if thread.is_alive():
            print 'Terminating process'
            self.process.terminate()
            thread.join()
        print self.process.returncode

#This will run one command for 5 seconds:
command = Command("ping www.google.com")
command.run(timeout=5)

这将运行ping www.google.com命令5秒钟然后超时。创建命令时,可以向列表中添加任意数量的参数,用空格分隔。

这是命令ls -lah

的示例
command = Command("ls -lah")
command.run(timeout=5)

一次运行中多个命令的示例:

command = Command("echo 'Process started'; sleep 2; echo 'Process finished'")
command.run(timeout=5)

简单而强大,就像我喜欢它一样!