Мне нужно получать непрерывные данные из функции Python, и одна из ее библиотек (Overlay) зависит от привилегий root. Мне нужно запустить эту функцию Python с помощью Flask.
Прежде всего, я искал, как предоставить root-доступ к скрипту Python, но, к сожалению, я не нашел ничего, что имитировало бы мой случай.
Подход, который я выбрал --
1/ Файл Python, содержащий библиотеку Overlay, предположим, что это имя child.py, которое содержит имя функции status_data
from pynq import PL
from pynq import Overlay
def main_path():
ol = Overlay("/home/xilinx/pynq/overlays/design_4/design_1_wrapper.bit")
return ol
def status_data():
ol = main_path()
data = '''my_code'''
return data
2/Имя файла Flask — app.py, где мне нужны непрерывные данные через конечную точку.
from create_json_data import status_data
from flask import Flask, render_template
from flask import jsonify
'''mayn others lib, doesn't include'''
'''my_code'''
@app.route("/auto_update_table")
def parse_auto_update_table(name=None):
data_json = status_data()
return jsonify(data_json)
3/ Оба файла находятся в одной папке. Я запустил этот child.py с помощью sudo python3 child.py
, и он работает. Выполнил код Flask с помощью sudo python3 app.py
. Я предполагаю, что app.py работает с sudo
, поэтому он возьмет все остальные иждивенцы с привилегиями root. Но я потерпел неудачу. Он выполняется, но через некоторое время падает.
Есть ли обходной путь для вызова функции status_data
файла child.py с привилегиями root из app.py без сбоя? Безопасность не является проблемой, поэтому я могу раскрыть свои учетные данные для любого файла сценария, а если также потребуется, я могу указать пароль вручную, но только один раз, поскольку это непрерывный процесс, поэтому многократный ввод пароля не является реальным решением.
Насколько я знаю, когда вы даете разрешение администратора (root) на исполняемый файл (ваш скрипт python).
Все, что делает исполняемый файл, выполняется с правами администратора. Попробуйте вызвать его с помощью самой учетной записи root или sudo -u root --login "python3 app.py"
, чтобы увидеть, работает это или нет.
Также говорить, что это не работает, не помогает. Если у вас есть след. Добавьте его, чтобы помочь нам ответить вам или любую другую информацию, которая поможет. Я не могу помочь тебе вот так
ОТРЕДАКТИРОВАНО ПОСЛЕ user10634362 КОММЕНТАРИЙ НИЖЕ
Извините, я сделал опечатку в команде sudo. Я довольно давно не работал с sudo (теперь работает с учетной записью root). Я имел в виду обратную связь, которую вы получаете, когда звоните sudo python3 app.py
. Это очень поможет
Отредактировал ответ: используйте sudo -u root --login "python3 app.py"
. Оставьте любой след или ошибку здесь, в комментариях
Проблема в другом моменте. Изменил заголовок и дал обходной путь в качестве ответа.
Я нашел решение. Прежде всего, я меняю название вопроса, так как после получения решения я понял, что нынешнее название не соответствует ситуации. Хотя дать привилегии root довольно просто. sudo python3 app.py
выполняет свою работу. Главный недостаток был в
from pynq import Overlay
и
def main_path():
ol = Overlay("/home/xilinx/pynq/overlays/design_4/design_1_wrapper.bit")
return ol
Я неоднократно вызывал эту функцию main_path
, но она требует значительной задержки, а ее там не было. Итак, я получил нежелательный сбой. После объявленияol = Overlay("/home/xilinx/pynq/overlays/design_4/design_1_wrapper.bit")
Я передал ol
в качестве глобальной переменной функции status_data
, и это решает проблему.
Вам нужно, чтобы ошибка отображалась в консоли? Если ДА, то добавлю. Однако я воспользовался вашим предложением, но потерпел неудачу.
sudo -i root python3 app.py
иsudo -i root "python3 app.py"
в обоих случаях у меня есть-bash: root: command not found
.