Модуль загрузки ошибок импорта с использованием сценария Bash в экземпляре EC2 (AWS) - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь запустить сценарий bash с помощью аргумента user_data метода spot_fleet_request. Сценарий выполняет все установки и подключается к файловой системе, но когда он запускает файл python, который мне нужно запустить, он выдает следующую ошибку:

Traceback (most recent call last):
  File "/home/ec2-user/efs/dir/create_lvl_output.py", line 8, in <module>
    from modeling import generators
ImportError: No module named modeling

Где modeling - это папка с скрипт я импортирую "models / generators.py". Я попытался назначить каталог переменной окружения PYTHONPATH, как предложено в этом сообщении , вот мой код:

#!/bin/bash
export PYTHONPATH=/home/ec2-user/efs/Day-Trader/day_trader/
echo $PYTHONPATH

...mount efs
...installs

python /home/ec2-user/efs/dir/create_lvl_output.py > levelset.txt

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

echo "export PYTHONPATH=/home/ec2-user/efs/dir/" >> ~/.bashrc
. ~/.bashrc      #--- failed to import, set PYTHONPATH variable correctly     

echo "export PYTHONPATH=/home/ec2-user/efs/dir/" >> /home/ec2-user/.bashrc
. /home/ec2-user/.bashrc   #--- failed to import, set PYTHONPATH variable correctly but got following error as well: /home/ec2-user/.bashrc: line 2: /root/.dlamirc: No such file or directory

Я также убедился, что сценарий действительно работает. Если я скопирую и вставлю скрипт прямо в терминал linux, когда я вошел в систему с пользователем ec2 (т.е. $ HOME = / home / ec2-user /), я отлично запустился и произвел правильный вывод. Поэтому я подумал, что если бы я сменил пользователя в верхней части сценария bash, как предложено в этом сообщении , это могло бы сработать, но следующие команды по-прежнему запускали все, что следовало как root:

su -l "ec2-user", su - ec2-user

, и я попытался запустить сценарий python, используя

su ec2-user -c 'python /home/ec2-user/efs/dir/create_lvl_output.py'

, но это тоже не сработало. У меня нет идей. Пожалуйста, помогите.

1 Ответ

3 голосов
/ 11 июля 2020

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

Однако, если не считать выполнения нетривиального объема работы, я действительно столкнулся с этой конкретной c ошибкой, которая возникает у вас в Amazon EC2 LTS ubuntu. Понятия не имею, что вызывает это, но его вроде python просто обходят стороной обычные настройки среды и не работают так, как вы ожидаете. В моем случае я просто использовал грязное исправление:

import os

os.environ['PYTHONPATH'] = '{}:{}'.format('my/addition/to/pythonpath', os.environ.get('PYTHONPATH', ''))
print(os.environ['PYTHONPATH'])
# prints my/addition/to/pythonpath:existing/things/on/pythonpath

, поэтому для вашего варианта использования попробуйте:

import os

os.environ['PYTHONPATH'] = '{}:{}'.format('/home/ec2-user/efs/Day-Trader/day_trader/', os.environ.get('PYTHONPATH', ''))
print(os.environ['PYTHONPATH'])
# prints /home/ec2-user/efs/Day-Trader/day_trader/:

, вы, конечно, можете делать с этим довольно неприятные вещи, например:

python -c "import os; os.environ['PYTHONPATH'] = '/my/addition/to/pythonpath'; import mymodule; mymodule.doThing()'

, если по какой-то причине вам не нравятся все, кому не нравится работать с этим. Шутки в сторону, я действительно использовал такие вещи в продакшене, и если вы поймете, что, черт возьми, вызывает эти проблемы с env, мне было бы интересно узнать, даже если я больше не работаю на машинах, на которых были эти проблемы.

...