Как передать все переменные окружения из моей оболочки в скрипт bash, который он вызывает? - PullRequest
0 голосов
/ 01 мая 2020

Я работаю Python 3.7, Django 2, на Ma c OS X. Когда я запускаю следующие команды из командной строки, они работают без проблем ...

localhost:web davea$ source ./venv/bin/activate
(venv) localhost:web davea$ python manage.py migrate maps
System check identified some issues:

WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
    HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See: https://docs.djangoproject.com/en/2.0/ref/databases/#mysql-sql-mode
Operations to perform:
  Apply all migrations: maps
Running migrations:
  No migrations to apply.

Однако, когда я создаю сценарий bash, содержащий команды

!#/bin/bash
source ./venv/bin/activate
python manage.py migrate maps

Этот сценарий умирает

localhost:web davea$ sh test.sh 
test.sh: line 1: !#/bin/bash: No such file or directory
Traceback (most recent call last):
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 15, in <module>
    import MySQLdb as Database
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/MySQLdb/__init__.py", line 18, in <module>
    from . import _mysql
ImportError: dlopen(/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/MySQLdb/_mysql.cpython-37m-darwin.so, 2): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/MySQLdb/_mysql.cpython-37m-darwin.so
  Reason: image not found

The above exception was the direct cause of the following exception:
Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
    utility.execute()
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 347, in execute
    django.setup()
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/apps/registry.py", line 112, in populate
    app_config.import_models()
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/apps/config.py", line 198, in import_models
    self.models_module = import_module(models_module_name)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/contrib/auth/models.py", line 2, in <module>
    from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/contrib/auth/base_user.py", line 47, in <module>
    class AbstractBaseUser(models.Model):
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/db/models/base.py", line 114, in __new__
    new_class.add_to_class('_meta', Options(meta, app_label))
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/db/models/base.py", line 315, in add_to_class
    value.contribute_to_class(cls, name)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/db/models/options.py", line 205, in contribute_to_class
    self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/db/__init__.py", line 33, in __getattr__
    return getattr(connections[DEFAULT_DB_ALIAS], item)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/db/utils.py", line 202, in __getitem__
    backend = load_backend(db['ENGINE'])
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/db/utils.py", line 110, in load_backend
    return import_module('%s.base' % backend_name)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 20, in <module>
    ) from err
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?

Я выяснил с помощью моих друзей в комментариях, что проблема в том, что некоторые env vars недоступны из моего bash скрипта. Вместо того, чтобы указывать c переменную cherry-pick, я хотел бы знать, как передать весь мой набор переменных среды сценарию до его запуска.

Ответы [ 3 ]

0 голосов
/ 04 мая 2020

Вы можете изменить стартовую строку, как показано ниже

#!/bin/bash -l
source ./venv/bin/activate
python manage.py migrate maps

Флаг -l обеспечит загрузку вашего профиля bash

0 голосов
/ 06 мая 2020

Я бы попробовал написать скрипт:

!#/bin/bash
./venv/bin/python manage.py migrate maps

Объяснение:

из "Создание виртуальных сред" https://docs.python.org/3/library/venv.html

Вам не нужно специально активировать среду; Активация просто добавляет двоичный каталог виртуальной среды к вашему пути, так что «python» вызывает интерпретатор Python виртуальной среды, и вы можете запускать установленные сценарии без использования их полного пути. Однако все сценарии, установленные в виртуальной среде, должны запускаться без ее активации и автоматически запускаться с Python в виртуальной среде.

0 голосов
/ 04 мая 2020

Не используйте sh для запуска сценариев оболочки (если это не действительно оболочка, которую вы хотите, что встречается редко). sh это не такая же оболочка как bash. Либо вызовите его с помощью bash, либо исправьте !#/bin/bash shebang на #!/bin/bash и просто вызовите сценарий напрямую; это обычно проще для управления (и меньше символов для ввода ...).

Я подозреваю, что простого использования правильной оболочки будет достаточно для решения вашей проблемы, но если нет, вам нужно выяснить, где DYLD_LIBRARY_PATH устанавливается (предположительно, либо ~/.bashrc, либо venv/bin/activate) и убедитесь, что переменная export. Bash переменные не являются переменными среды по умолчанию, вам нужно export их, чтобы указать bash включить их в переменные env для любых вызываемых подпроцессов.

...