如何在os.system()中指定路径以在Flask

时间:2016-03-15 12:13:45

标签: python shell flask

我正在使用Flask来执行shell脚本,这是我的实际代码:

def execute(cmd, files):
    os.system(cmd)
    back =dict()
    for file in files:
        with open(file, 'r') as f:
            info = f.read()
            back[file] = info
    return back

@app.route('/executeScript', methods = ['POST'])
def executeScript():
    output = execute('./script.sh', ['file1.txt', 'file2.txt'])

    return render_template('template.html', output=output)

但我想把我的脚本(script.sh)放在特定的文件夹中。为此,我需要在我的代码中添加路径,但是当添加它时,它不再起作用。我尝试过类似的东西:

output = execute(['sh', 'path/to/myscript/script.sh'], ['path/to/myscript/file1.txt', 'path/to/myscript/file2.txt'])

但这不起作用,脚本根本没有执行。 知道如何让它发挥作用吗?

5 个答案:

答案 0 :(得分:2)

我明白了! 在我执行的脚本(script.sh)中,我将一些命令的输出重定向到文本文件。 我需要在这些文本文件中添加绝对路径的路径,如下所示:

some command > home/path/to/file.txt

此代码工作正常但是:output = execute(['sh', 'path/to/myscript/script.sh'], ['path/to/myscript/file1.txt', 'path/to/myscript/file2.txt'])

感谢大家的帮助!

答案 1 :(得分:1)

根据os.system(强调我的)的描述:

  

在子shell中执行命令(字符串)

当您尝试运行

execute(['sh', 'path/to/myscript/script.sh'], ...)

...您最终将列表传递给os.system。尝试

execute('sh path/to/myscript/script.sh', ...)

答案 2 :(得分:1)

您可以使用的是“subprocess.Popen(path)”,子进程模块的在线文档是here

答案 3 :(得分:0)

您确定自己的文件路径正确吗?三重检查,因为这通常是问题; o

我会有一个像这样的变量:

script_dir = 'path/to/myscript'

然后有

output = execute(['sh', os.path.join(script_dir, 'script.sh')], [os.path.join(script_dir, 'file1.txt'), os.path.join(script_dir, 'file2.txt'])

因为这会降低您输入拼写错误的可能性。你甚至可能想要进一步发展:

script = os.path.join(script_dir, 'script.sh')
file_1 = os.path.join(script_dir, 'file1.txt')

等。 然后:

output = execute(['sh', script], [file_1, file_2])

如果您的路径发生变化,这将使您更容易阅读和编辑。

希望这能解决问题!

答案 4 :(得分:0)

这样的事情会不会更好?它使用子进程模块而不是不推荐使用的os.system()

import subprocess

def execute(cmd, files):
    subp_ret = ""
    cmd_list = [cmd]
    cmd_list.extend(files)
    try:
        subp_ret = subprocess.check_output(cmd_list)
        """ at this point you have the output of the command in subp_ret in case you need it """
    except Exception as e:
        print("Failed to run subprocess. Details: " + str(e))
    back =dict()
    for file in files:
        with open(file, 'r') as f:
            info = f.read()
            back[file] = info
    return back

@app.route('/executeScript', methods = ['POST'])
def executeScript():
    output = execute('./script.sh', ['file1.txt', 'file2.txt'])
    return render_template('template.html', output=output)