2017-01-28 13 views
0

Я пытаюсь запустить код python с помощью команды sudo, но каждый раз, когда я это делаю, он дает мне ошибку импорта. Однако, если я запустил, скажем, import numpy в терминале, это не дает мне никаких ошибок. Кроме того, если я создаю код с несколькими Imports, а затем запускаю его без команды sudo, это не дает мне никаких ошибок, и код работает безупречно. Я уже добавил Defaults env_keep += "PYTHONPATH" в папку sudoers, так что это не проблема. Я установил Anaconda3, так что, может быть, это полезная информация?ImportError только с sudo при запуске приложения python?

Я запускаю GNOME Ubuntu 16.04.1 LTS. И версия ядра 4.4.0-59-generic.

Прошу прощения, я новичок в этом, но я учусь.

Я побежал which python, а затем я побежал sudo which python, и они дали мне разные каталоги.

sudo which python дал мне usr/bin/pythonwhich python дал мне home/user/anaconda3/bin/python

Я попытался запустить sudo ./anaconda3/envs/ml/bin/python doc.py, но теперь он говорит, что не может найти файл.

Я работаю с sudo, потому что мне нужно разрешение для docker для работы.

EDIT: попытка sudo -E вместо sudo дает ту же ошибку.

+0

Попробуйте заменить 'sudo' на' sudo -E' –

ответ

2

Проблема у вас есть то, что делает sudoне следовать обычной PATH порядка при взгляде на исполняемый файл: он ищет системные каталоги первый. Это написано в man sudo:

БЕЗОПАСНОСТИ ПРИМЕЧАНИЯ sudo пытается быть безопасной при выполнении внешних команд.

Чтобы предотвратить команду подмены sudo проверяет "." и "" (как обозначающее текущий каталог) последние при поиске команды в пользователя PATH (если один или оба находятся в PATH). Обратите внимание, однако, что фактическая переменная среды PATH не изменяется и передается без изменений в программу, выполняемую sudo.

Таким образом, чтобы исправить это, вы должны убедиться, что команда, которую вы дать sudo не может соответствовать системный исполняемый файл, то есть указать абсолютный путь:

sudo /home/user/anaconda3/bin/python 

общая команда, которая должна работать на:

sudo "$(which python)" 

Это потому, что which python выполняется , прежде чемsudo, а его выход передается в качестве аргумента sudo. Однако sudo по умолчанию не выполняет каких-либо «оболочечных» настроек и может ограничивать среду, поэтому вы можете использовать флаги -E или -i, чтобы сделать sudo незаменимым окружением и выполнить правильную настройку оболочки.

+0

Я просто попробовал это. Я изменил приложение python в каталог/home/user/anaconda3/bin /, и я запустил код sudo/home/user/anaconda3/bin/python mlcode.py в терминале. Теперь он говорит, что там нет такого файла или каталога. –

+0

@AaronGonzalez Ну, вам нужно использовать правильный путь. Я просто скопировал то, что вы вставили, если это неправильно, я ничего не могу с этим поделать. – Bakuriu

+0

Я понял. Однако теперь он говорит, что он не может найти модуль «__main__». –