cmd и bat ведут себя по-разному - PullRequest
0 голосов
/ 28 мая 2019

РЕДАКТИРОВАТЬ:

После обсуждения проблемы с коллегой, мы думаем, что знаем, почему .bat работает иначе, чем при вводе строки за строкой в ​​окне cmd. Мы считаем, что строка ./venv/Scripts/activate.bat активирует виртуальную среду в оболочке, отличной от той, в которой выполняется остальная часть кода. Мне нужно, чтобы весь код запускался в той же оболочке, начиная с этой строки. (К вашему сведению, я не уверен, имеет ли это смысл, поскольку я относительно новичок в этом.)

Я пытаюсь создать виртуальную среду, запустив bat-файл с необходимыми для этого командами. Когда я запускаю строки из своего кода .bat, копируя их в окно cmd и выполняя каждую из них по отдельности, код работает должным образом. Когда я запускаю файл .bat, он не работает.

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

Эта настройка не может быть изменена, поэтому вместо этого мне нужно правильно перемещаться по каталогам в моем .bat-файле.

Я посмотрел в StackOverflow и не смог найти никаких вопросов, связанных с похожим поведением. Я читал соответствующую документацию, но пока не нашел ничего полезного. Я использую дистрибутив anaconda3. Windows 10. Я не уверен, какая информация может быть полезна для устранения неполадок, поэтому, пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Вы найдете мой код ниже.

echo ON

REM Change directory to user's local dir
chdir C:\Users\USERNAME
C:

REM Check whether environments folder exists, if not, create it.
if not exist "C:\Users\USERNAME\Environments\" mkdir C:\Users\USERNAME\Environments

REM Create virtual environment in this new/existing folder and activate it.
python -m venv venv/
"./venv/Scripts/activate.bat"

REM Change directory to network drive where document files are located
chdir I:\NETWORKDIR_PATH\FOLDER_OF_INTEREST
I:

REM Make sure necessary packages are installed.
pip install -r ./src/requirements.txt

REM Run script and close shell after 20 secs
python "./src/main_script.py"

REM FOLDER_OF_INTEREST contains the following items:
REM two excel files which will interact with the main_script.py script
REM a folder called "src" which has the packages to be installed within my environment
REM "src" also contains two python scripts. The first is the main_script.py, the other contains functions called by main_script.py

Как есть, когда я запускаю каждую строку отдельно в окне cmd, все работает просто отлично.

Если я попытаюсь вместо этого запустить файл .bat, код будет работать до

python -m venv venv/
"./venv/Scripts/activate.bat"

в этот момент окно cmd закрывается и больше ничего не происходит ...

Любая помощь / совет приветствуется!

PS: есть команды ping, потому что если нет, окно cmd закрывается слишком быстро, и я не вижу, что произошло.

1 Ответ

2 голосов
/ 28 мая 2019

Мы считаем, что строка ./venv/Scripts/activate.bat активирует виртуальную среду в оболочке, отличную от той, в которой выполняется остальная часть кода.

Нет.Пакетные файлы выполняются построчно, пока не достигнет EOF (Конец файла).Таким образом, в конце activate.bat интерпретатор считает свою работу выполненной и все.

Чтобы иметь возможность «вернуться» к вызывающему сценарию, вам необходимо вызвать вызываемый сценарий(который в основном сохраняет точку возврата)

Чтобы буквально запустить скрипт в другом экземпляре cmd (то, что вы называли «виртуальной средой в оболочке»), вам понадобится start команда.

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