我正在使用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'])
但这不起作用,脚本根本没有执行。 知道如何让它发挥作用吗?
答案 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)