我正在写一个小网页,其任务是让用户上传他的输入文件并上传我想在python中执行我的计算程序,这将为我提供输出。
我的代码如下所示:
import os
import os.path
import datetime
import subprocess
from flask import Flask, render_template, request, redirect, url_for
from werkzeug import secure_filename
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads'
app.config['ALLOWED_EXTENSIONS'] = set(['txt', 'gro', 'doc', 'docx'])
current_time = datetime.datetime.now()
file_time = current_time.isoformat()
proper_filename = file_time
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1] in app.config['ALLOWED_EXTENSIONS']
def run_script():
subprocess.call(['/home/martyna/Dropbox/programowanie/project_firefox/topologia.py', '/uploads/proper_filename'])
@app.route('/')
def index():
return render_template('index.html')
@app.route('/upload', methods = ['POST'])
def upload():
file = request.files['file']
if file and allowed_file(file.filename):
file.save(os.path.join(app.config['UPLOAD_FOLDER'], proper_filename))
run_script().start()
return "Thank you for uploading"
if __name__ == '__main__':
app.debug = True
app.run(host='0.0.0.0')
上传顺利,但问题是,当我点击上传时,我收到消息OSError: [Errno 13] Permission denied
,导致问题的行是:
subprocess.call(['/home/martyna/Dropbox/programowanie/project_firefox/topologia.py', '/uploads/2014-05-16T22:08:19.522441'])
程序topologia.py从命令python topologia.py input_file
我不知道如何解决这个问题。
答案 0 :(得分:1)
你有两个问题:
您的脚本可能未标记为可执行文件。您可以使用当前的Python可执行路径来解决这个问题;使用sys.executable
获取该路径。
您告诉脚本要处理/uploads/proper_filename
,但您实际上传文件的文件名根本不相同;您应该使用proper_filename
引用的字符串的内容。
将这两者放在一起:
import sys
from flask import current_app
def run_script():
filename = os.path.join(current_app.config['UPLOAD_FOLDER'], proper_filename)
subprocess.call([
sys.executable,
'/home/martyna/Dropbox/programowanie/project_firefox/topologia.py',
filename])
你不需要就.start()
的结果致电run_script()
;您将在NoneType
上收到属性错误。只需致电run_script()
并完成它:
run_script()
答案 1 :(得分:0)
使用相同的权限不能从命令行和服务器执行脚本。
user@mycomputer:~$ ./script
在此示例中,./script
由user
启动。因此,如果它执行某些输入/输出,则访问权限将取决于user
权限。
当它是运行脚本的服务器时,在您的情况下 Flask ,可能www-data
启动脚本。因此访问权限不一样。
因此,要在文件夹中创建文件,执行该脚本的用户应具有该文件夹的权限。