Как не запускать батник и питон параллельно?

У меня есть ниже скрипты

1)

  os.chdir("C:\\RTM3Run_Full\\Python Codes")
  os.startfile("2015_RUNcvm_64_Crash.bat")

2)

 for i in range(settings.loop):
    ....

Я хочу начать раздел «for i in range(settings.loop):» (т.е. часть 2) после того, как пакетный файл будет полностью завершен. Но он выполняет только часть 1) и часть 2) параллельно. Я знаю, что должен иметь возможность настроить функцию паузы для ожидания. Но я не знаю, сколько времени занимает часть 1). Кто-нибудь знает, есть ли другой более разумный способ запустить 1) и 2) последовательно?

Большое спасибо.

Возможный дубликат Вызов внешней команды в Python

Io-oI 12.02.2019 20:52
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
667
3

Ответы 3

os.startfile имитирует щелчок в проводнике. Это означает, что ваш командный файл будет работать в фоновом режиме.

Замените это:

os.chdir("C:\\RTM3Run_Full\\Python Codes")
os.startfile("2015_RUNcvm_64_Crash.bat")

с помощью правильного вызова блокирующего подпроцесса, и, поскольку это пакетный файл, и вы хотите избежать shell=True, префикс cmd /c в качестве списка аргументов. Также не делайте chdir, просто используйте аргумент текущего рабочего каталога, чтобы текущий каталог не изменился:

rc = subprocess.call(["cmd","/c","2015_RUNcvm_64_Crash.bat"],cwd=r"C:\RTM3Run_Full\Python Codes")

вы можете проверить код возврата или использовать check_call для остановки с исключением, если пакетный файл возвращает ненулевой код выхода.

Мой ответ основан на этом ссылка на сайт

Предположим, что у вас есть эти команды в отдельных сценариях, вы можете сделать это:

import multiprocessing
import os                                              

# Creating the tuple of all the processes which can be run in parallel
all_parallel_processes = ('script_A.py', 'script_B.py', 'script_C.py')     

next_run = ('script_D.py')

# This block of code enables us to call the script from command line.                                                                                
def execute(process):                                                             
    os.system(f'python {process}')                                       


process_pool = Pool(processes = 4)                                                        
process_pool.map(execute, all_parallel_processes)
process_pool.map(execute, next_run)

Где script.d запускается только после завершения сценариев a, b и c (они выполняются параллельно).

Наконец я нашел простое решение

1)

os.chdir("C:\RTM3Run_Full\Коды Python")

ОС.система("2015_RUNcvm_64_Crash.bat")

2)

для i в диапазоне (settings.loop): ....

Это гарантирует запуск части 2) после завершения части 1).

Спасибо всем за помощь~

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