Передача переменной Python в пакетный файл

У меня есть базовый пакетный файл, который принимает пользовательский ввод:

@echo off
set /p Thing= Type Something: 
echo %Thing%
pause

Однако я хотел бы использовать переменную, написанную на Python, для передачи в пакетный файл. Скажем, просто строка 'arg1' Это всего лишь базовый пример, но я пока не могу в этом разобраться. Приведенный ниже код запустит пакетный процесс, но 'arg1' не повлияет

import subprocess

filepath = r'C:\Users\MattR\Desktop\testing.bat'

subprocess.call([filepath, 'arg1'])

Я также пробовал p = subprocess.Popen([filepath, 'arg1']), но пакетный файл не запускается в Python.

Я искал в Интернете и SO, но ни один из ответов не работает для меня. Вот несколько ссылок, которые я также пробовал: Пример 1, Пример 2. Я также пробовал другие, но они кажутся довольно специфичными для нужд пользователя.

Как мне начать передавать переменные Python в мои пакетные файлы?


person MattR    schedule 21.03.2017    source источник


Ответы (2)


Ваш подпроцесс, вероятно, должен работать с оболочкой, если вы хотите, чтобы bash работал правильно.

Фактическое значение "shell=True" в подпроцессе

so

subprocess.Popen([filepath, 'arg1'], shell=True)

Если вы тоже хотите увидеть вывод, то:

item = subprocess.Popen([filepath, 'arg1'], shell=True, stdout=subprocess.PIPE)
for line in item.stdout:
     print line

В качестве дальнейшего редактирования вот рабочий пример того, что вам нужно:

sub.py:

import subprocess
import random


item = subprocess.Popen(["test.bat", str(random.randrange(0,20))] , 
                         shell=True, stdout=subprocess.PIPE)
for line in item.stdout:
    print line

тест.bat

@echo off
set arg1=%1
echo I wish I had %arg1% eggs!

запустить его:

c:\code>python sub.py
I wish I had 8 eggs!


c:\code>python sub.py
I wish I had 5 eggs!


c:\code>python sub.py
I wish I had 9 eggs!
person Keef Baker    schedule 21.03.2017
comment
Я получаю недопустимую синтаксическую ошибку (кроме отсутствующих скобок) - person MattR; 21.03.2017
comment
Ага, отредактировал. Я накосячил :( В принципе, оболочка вне квадратных скобок. - person Keef Baker; 21.03.2017
comment
Так что это работает так же, как мой код: subprocess.call([filepath, 'arg1']), но я не могу сказать, был ли запущен файл .bat или имел какое-либо влияние? не отображается в Python. - person MattR; 21.03.2017
comment
хорошо, если вы тоже хотите увидеть вывод... item = subprocess.Popen([filepath, 'arg1'], shell=True, stdout=subprocess.PIPE) тогда вы можете получить print item.stdout - person Keef Baker; 21.03.2017
comment
Мы (в основном вы) приближаемся! Я получаю <_io.BufferedReader name=3>. Очень ценю помощь. - person MattR; 21.03.2017
comment
вы можете перебрать его с помощью for line in item.stdout:, а затем распечатать каждую строку. Я думаю, что это список, хотя он отображается как объект. - person Keef Baker; 21.03.2017
comment
Я попробовал это, а также попытался составить item список. Просто зависает процесс. - person MattR; 21.03.2017
comment
Если он сидит в ожидании ввода, он, вероятно, будет. - person Keef Baker; 21.03.2017
comment
возможно, вам придется убрать паузу. (извините, я немного написал о bash, прежде чем понял, что это Windows) - person Keef Baker; 21.03.2017
comment
Я должен быть занозой в тылу... Прошу прощения. Я думаю, что если переменные передаются, это действительно не имеет значения. но это будет вишенкой на торте. Удалил pause в бате и все равно висит. Тоже пробовал set /p Thing= %1 и тоже зависает. - person MattR; 21.03.2017
comment
Спасибо за терпение и помощь! - person MattR; 21.03.2017

Вот как мне удалось вызвать переменную из python в пакетный файл. Сначала создайте файл Python следующим образом:

import os
var1 = "Hello, world!"
os.putenv("VAR1", var1) #This takes the variable from python and makes it a batch one

Во-вторых, создайте свой пакетный файл, перейдя в папку, в которой вы хотите, чтобы ваша программа Python работала, затем щелкните правой кнопкой мыши на карте и создайте новый текстовый файл. В этом текстовом файле напишите все, что вы хотите сделать с переменной, и убедитесь, что вы вызываете свою переменную, используя %...%, например:

echo %VAR1%

Сохраните этот файл как пакетный файл следующим образом: файл>сохранить как>имя_файла.bat, затем выберите: сохранить как файл: все файлы.

Затем, чтобы вызвать ваш командный файл в python, напишите:

os.system("name_of_file.bat")

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

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

person jaakdentrekhaak    schedule 06.02.2019