Обновлено:
Обсудив проблему с коллегой, мы думаем, что знаем, почему .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 закрывается слишком быстро, и я не вижу, что произошло.
это просто файл, который мне нужно запустить, чтобы активировать виртуальную среду для моего скрипта Python.
Это не совсем ответ на мой вопрос.
Извините, но я не уверен, как я могу быть более информативным. Это типичный файл activate.bat
, используемый для активации среды Python. Я не могу скопировать и вставить код внутри этого комментария, так как он слишком длинный.
Изменить "./venv/Scripts/activate.bat"
на call "./venv/Scripts/activate.bat"
СПАСИБО!!! это сделало это. Я попытаюсь прочитать о разнице между «вызовом» и почему. Ваше здоровье
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
(то, что вы назвали «виртуальной средой в оболочке»), вам понадобится команда Начало.
Что в
activate.bat
?