привилегии sudo в python virtualenv - PullRequest
0 голосов
/ 14 мая 2018

Окружающая среда

  • Windows Subsystem for Linux с последовательной связью с GPS.

  • Adafruit GPS подключен к Arduino Nano, который подключен к COM10Windows Subsystem for Linux это эквивалентно /dev/ttyS10

  • Требования: pyserial

Я написал простой скрипт для чтения информации измодуль GPS:

import serial

def select_sentence():
""" This function sends serial data to the GPS module to display only GPGGA and GPRMC"""

def read_gps():
    ser = serial.Serial("/dev/ttyS10", 9600)
    while True:
         print(ser.readline().decode('utf-8'))

if __name__ == "__main__":
     select_sentence()
     read_gps()

В virtualenv я выбрал Python3, и когда я его выполнил, я получил Permission Error для последовательного порта /ttyS10, поэтому я выбрал sudo chmod 666 /dev/ttyS10, чтобы использовать скрипт вvirtualenv.

Однако есть ли альтернатива вышеупомянутому chmod /dev/serial, чтобы избежать PermissionErrors?

Я знаю, что даже в virtualenv, когда кто-то использует sudo,пакеты, установленные в virtualenv, не рассматриваются, и вместо этого sudo ищет ваши глобальные pip пакеты.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Также убедитесь, что вы создали virtualenv без команды sudo, так как это может вызвать проблемы с разрешениями при использовании виртуального env без sudo позже.Если это так, запустите следующую команду:

sudo chown -R your_username:your_username path/to/virtuaelenv/

Чем вы можете включить разрешения на чтение /dev/ttyS10 для вашего пользователя и запускать скрипт Python этим пользователем.

ПРИМЕЧАНИЕ : Также вы хотите добавить строку shebang в начало вашего скрипта python с указанием пути к интерпретатору python, который находится в вашем env.Так что вы сможете звонить без переводчика.

#!/path/to/venv/bin python3

Подробнее об этом ТАК Ответ: Должен ли я поставить #!(Шебанг) ​​в скриптах Python, и какую форму он должен принимать?

0 голосов
/ 14 мая 2018

Когда вы активируете virtualenv (по source venv/bin/activate или аналогичному), он в основном просто говорит вашей оболочке: «эй, когда вы ищете команду, посмотрите в venv/bin, прежде чем искать в другом месте», обновив $PATH переменная окружения. Таким образом, когда вы запускаете команду типа python, ваша оболочка видит и запускает python в venv/bin вместо /usr/bin или где-либо еще. Эта копия Python настроена на поиск в venv/lib пакетов, а не /usr/lib, так что вы можете использовать пакеты в вашем virtualenv вместо тех, которые установлены глобально.

Однако, когда вы запускаете программу с sudo, она игнорирует $PATH. Почему это так? Потому что в исторические времена * nix было обычным делом настраивать sudo, чтобы пользователи могли выполнять с ним только определенные команды, такие как (скажем) sudo iftop 1 , чтобы каждый мог проверить, что сеть использовалась, но все равно никто не мог запустить sudo rm -rf /*. Если sudo уважает пользователя $PATH, вы можете просто скопировать /bin/rm в ~/bin/iftop, добавить ~/bin в $PATH, а затем запустить sudo iftop - но вы на самом деле запустите rm от имени root!

Итак, sudo игнорирует $PATH по умолчанию. Но вы все равно можете выполнять определенные программы, указав sudo полный путь к программе, поэтому вы можете запускать Python в вашем virtualenv от имени root, выполнив что-то вроде sudo ./venv/bin/python (при условии, что ваша virtualenv называется venv). Это сделает вас root'ом, при этом все еще имея доступ к пакетам в вашем virtualenv, например, pyserial.

1 : На самом деле я не знаю ни одной команды, которая была бы настроена подобным образом, это плохой пример, извините.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...