Cmd и bat ведут себя по-разному

Обновлено:

Обсудив проблему с коллегой, мы думаем, что знаем, почему .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 закрывается слишком быстро, и я не вижу, что произошло.

Что в activate.bat?

melpomene 28.05.2019 18:54

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

Jr Analyst 28.05.2019 19:11

Это не совсем ответ на мой вопрос.

melpomene 28.05.2019 19:20

Извините, но я не уверен, как я могу быть более информативным. Это типичный файл activate.bat, используемый для активации среды Python. Я не могу скопировать и вставить код внутри этого комментария, так как он слишком длинный.

Jr Analyst 28.05.2019 19:24

Изменить "./venv/Scripts/activate.bat" на call "./venv/Scripts/activate.bat"

Aacini 28.05.2019 19:35

СПАСИБО!!! это сделало это. Я попытаюсь прочитать о разнице между «вызовом» и почему. Ваше здоровье

Jr Analyst 28.05.2019 21:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

We think that the line ./venv/Scripts/activate.bat activates a virtual environment in a shell different than where the rest of the code runs.

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

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

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

Другие вопросы по теме