Имейте в виду, что независимо от сценария причина всегда одинакова в .NET:
Вы пытаетесь использовать ссылочную переменную, значение которой
Nothing
/null
. Если для ссылочной переменной значениеNothing
/null
, это означает, что на самом деле оно не содержит ссылку на экземпляр любого объекта, который существует в куче.Вы либо никогда не присваивали какую-либо переменную, никогда не создавали экземпляр значения, присвоенного переменной, или вы вручную устанавливали переменную, равную
blockquote>Nothing
/null
, или вы вызывали функцию, которая установите для этой переменной значениеNothing
/null
.
Простое решение, которое работает для меня. Я не знаю, зачем вам нужен скрипт bash, который в принципе делает бесполезный шаг (я не прав?)
import os
os.system('/bin/bash --rcfile flask/bin/activate')
Что в основном делает то, что вам нужно:
[hellsing@silence Foundation]$ python2.7 pythonvenv.py
(flask)[hellsing@silence Foundation]$
Затем вместо деактивации venv, просто Ctrl + D или выйдите. Это возможное решение или не то, что вы хотели?
Оказывается, да, проблема не проста, но решение есть.
Сначала мне пришлось создать сценарий оболочки, чтобы обернуть команду «source». Тем не менее я использовал «.». вместо этого, потому что я читал, что лучше использовать его, чем источник для сценариев bash.
#!/bin/bash
. /path/to/env/bin/activate
Тогда из моего сценария python я могу просто сделать это:
import os
os.system('/bin/bash --rcfile /path/to/myscript.sh')
Целый трюк лежит внутри аргумента -rcfile.
Когда выход из интерпретатора python покидает текущую оболочку в активированной среде.
Win!
Самое простое решение для запуска вашего скрипта в интерпретаторе virtualenv заключается в замене строки по умолчанию shebang на путь к вашему интерпретатору virtualenv, как и в начале скрипта:
#!/path/to/project/venv/bin/python
Сделать исполняемый файл сценария:
chmod u+x script.py
Запустить скрипт:
./script.py
Voila!
Если вы хотите запустить подпроцесс Python под virtualenv, вы можете сделать это, запустив скрипт с помощью интерпретатора python, который живет в каталоге virtualenv / bin /:
# path to a python interpreter that runs any python script
# under the virtualenv /path/to/virtualenv/
python_bin = "/path/to/virtualenv/bin/python"
# path to the script that must run under the virtualenv
script_file = "must/run/under/virtualenv/script.py"
subprocess.Popen([python_bin, script_file])
Однако, если вы хотите чтобы активировать virtualenv под текущим интерпретатором python вместо подпроцесса, вы можете использовать скрипт activate_this.py
:
# doing execfile() on this file will alter the current interpreter's
# environment so you can import libraries in the virtualenv
activate_this_file = "/path/to/virtualenv/bin/activate_this.py"
execfile(activate_this_file, dict(__file__=activate_this_file))
Чтобы запустить другую среду Python в соответствии с официальной документацией Virtualenv , в командной строке вы можете указать полный путь к исполняемому бинарнику python, просто (нет необходимости активировать virtualenv раньше):
/path/to/virtualenv/bin/python myscript.py
То же самое относится, если вы хотите вызывать скрипт из командной строки с помощью virtualenv, вам не нужно активировать его раньше:
me$ /path/to/virtualenv/bin/python myscript.py
То же самое для Windows (будь то из командной строки или из сценария:
> \path\to\env\Scripts\python.exe myscript.py
Детский процесс env теряется в момент его прекращения существования и перемещение содержимого среды отсюда к родительскому лицу несколько сложно.
Что вам, вероятно, нужно сделать, это создать скрипт оболочки (вы можете генерировать один динамически в / tmp), который выведет переменные среды virtualenv в файл, который затем вы читаете в родительском процессе Python и помещаете в os.environ.
Или вы просто анализируете активацию скрипта при использовании для строки («bin / activate») и вручную извлекать материал и помещать в os.environ. Трудно, но не невозможно.