Выполнение того же пакетного файла (.bat) с использованием python

#python #loops #batch-file #spyder #modeling

#python #циклы #пакетный файл #spyder #моделирование

Вопрос:

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

 import os
import glob
import subprocess

ws = (r'C:UsersWahid HussainzadaDesktopTakahashi_2018_9_test')
os.chdir(ws)
myFile = glob.glob('*.txt')
myModel = glob.glob('2cdrmv3.bat')


for i in myFile:
    if i.startswith('rain'):
        print(i)
        myBat = open(ws 'wahid.bat','w ')
        myBat.write('cdrmv3.exe param1.txt param2.txt param3.txt param4.txt bsndir.txt slope.txt length.txt order.txt takahashi_landuse.txt takahashi_acc.txt 0 # 1 takahashi_thiessen.txt 13 ' str(i)  ' 0 1 out_' str(i)  ' 0 outgridouta2 outgridoutb')
        myBat.close()
        subprocess.call('C:UsersWahid HussainzadaDesktopTakahashi_2018_9_testwahid.bat')
    else:
        print("Other txt files than rain files")
            
 

Комментарии:

1. См. Документацию для subprocess.run ( docs.python.org/3/library /… ). Если вы укажете shell=True , команда будет запущена с помощью оболочки. Но вы должны быть осведомлены о соображениях безопасности, если вы укажете shell=True ( docs.python.org/3/library /… )

Ответ №1:

попробуйте использовать строковые литералы

subprocess.call(r'C:UsersWahid HussainzadaDesktopTakahashi_2018_9_testwahid.bat')

возможно, вам придется сделать что-то вроде

 cmd = r'C:WindowsSystem32cmd.exe'
script = r'C:UsersWahid HussainzadaDesktopTakahashi_2018_9_testwahid.bat'
subprocess.call([cmd,script])
 

Комментарии:

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

2. Я использовал коды, он не выдает никаких ошибок. Он выполняется в течение длительного времени, и никаких выходных данных не поступает.

Ответ №2:

На основе ответа @Joran Beasley код может работать с небольшими изменениями, как показано ниже:

 cmd = r'C:WindowsSystem32cmd.exe'
script = r'Working directory*.bat'
subprocess.call([script,cmd])