【问题标题】:Run c++ executable from python flask从 python 烧瓶运行 c++ 可执行文件
【发布时间】:2021-12-12 20:57:21
【问题描述】:

我正在尝试从烧瓶应用程序运行 c++ 可执行文件。 我为参数创建了两个输入,一个按钮用于提交和运行可执行文件。

我要执行的是这个命令行:./Ex02_DriveStatus 5 blablabla.sw

可执行文件Ex02_DriveStatus 与python 文件位于同一文件夹中。 当我从终端 ./Ex02_DriveStatus 5 blablabla.sw 运行它时 它运行良好。但我希望能够从我的烧瓶应用程序/网络界面运行它。

这是我的python代码:

import canopen
from datetime import datetime
import time
import os
import numpy as np
import argparse
from DriveLib import Drive
from flask import Flask 
from flask import request 
from flask import render_template
import subprocess
from subprocess import PIPE

# os.system("sudo ifconfig can0 down")
# os.system("sudo ip link set can0 type can bitrate 500000")
# os.system("sudo ifconfig can0 up")
app = Flask(__name__)

@app.route('/')
def home():
    return render_template('flashing.html')

@app.route('/flashing/')
def home_flash():
    return render_template('flashing.html')

@app.route('/flashing/', methods=['POST'])
def flash():

    global node_id
    global file_name
    node_id = request.form['node_id']
    file_name = request.form['file_name']
    if request.form.get("submit"):
        node_id = request.form['node_id'] 
        file_name = request.form['file_name'] 
    if node_id == '':
        node_id = 0
    if file_name == '':
        file_name = 0
    if request.method == 'POST':
        output = run(node_id, file_name)
    return render_template('flashing.html', output=output, node_id=node_id, file_name=file_name)

def run(node_id, file_name):
    s=subprocess.run(["./Ex02_DriveStatus", node_id, file_name],stdout=PIPE)
    print(s)
    return s.stdout.decode("utf-8")

还有我的 HTML 代码:

<!DOCTYPE HTML>
<html>
    <head>
        <link rel="stylesheet" href='/static/main.css'/>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
        <script type=text/javascript src="{{
            url_for('static', filename='main.js') }}"></script>
        <script>
            window.addEventListener("load", function(){
                // BASIC
                numpad.attach({target: "demoA"});
                // WITH OPTIONS
                numpad.attach({target: "demoB"});
                numpad.attach({target: "demoC"});
            });
        </script>
        <title>FLASH the drive</title>
        <p class="title"><strong>FLASH THE DRIVE</strong></p>
    </head>
    <body>
        <div id="menu">
            <ul id="onglets" >
                <li class="active"><a href="/flashing/"> Flash drive </a></li>
                <li><a href="/test_drive/"> Test drive </a></li>
                <li><a href="/test_module/"> Test module </a></li>
            </ul>
        </div>
        <div class="content">
            <!--test form-->
            <form method="post" action="/flashing/">
                <textarea id="output" name="output" rows="30" cols="50" style="resize:none" placeholder="//Your output here.">{{output}}</textarea><br>
                <table>
                    <tr>
                        <td> <p>Chose the ID you want to flash with:</p> </td> 
                        <td> <input name="node_id" id="demoA" style="height:50px;"> </td> 
                    </tr>
                    <tr>
                        <td> <p>File name:</p> </td> 
                        <td> <input name="file_name" style="height:50px;"> </td> 
                    </tr>
                    <tr>
                        <td> <input id="buttonid" type="submit" name="submit" class="submit" value="FLASH"> </td>           
                    </tr>
                </table>
            </form>
        </div>
    </body>
</html>

当我尝试这个flask run 时,它一直在运行而没有结果。

我尝试创建一个 python 文件test.py,只打印一个print("hello")。 我认为这条线是问题所在:

s=subprocess.run(["./Ex02_DriveStatus", node_id, file_name],stdout=PIPE)

所以我用一个简单的文件(test.py)对其进行了测试:

s=subprocess.run(["python", file_name],stdout=PIPE)

file_name 输入我会输入test.py 并且它正在工作。

所以我不知道是因为 c++ 的可执行文件给了我一些冲突,还是我写得不好。

【问题讨论】:

  • 错误信息告诉你找不到文件。这意味着它不在同一个目录中
  • 作为一个提示:如果用户可以选择他们想要运行的文件,他们是否也可以运行他们不应该运行的文件?我的意思是,你确定这里面没有安全漏洞吗?
  • 你得到什么错误信息?

标签: python c++


【解决方案1】:

确保您的程序正在输出到 STDOUT。 尝试删除 stdout=PIPE 或尝试管道 STDERR。

【讨论】:

  • 现在运行良好,谢谢。另一个问题:我想在我的 Web 界面上显示在 textarea 中运行可执行文件的结果(如您在 html 文件的代码中所见)。但是,此输出中不显示任何内容。当我尝试一些简单的示例时,终端上显示的所有内容也显示在网络应用程序的文本区域中。你知道出了什么问题吗?安全问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
相关资源
最近更新 更多