отправить произвольное количество входных данных из python в .exe - PullRequest
2 голосов
/ 11 сентября 2009

<code>
p = subprocess.Popen(args = "myprog.exe" + " " +
                     str(input1) + " " +
                     str(input2) + " " +
                     str(input3) + " " +
                     strpoints, stdout = subprocess.PIPE)

в приведенном выше коде input1, input2 и input3 являются целыми числами, которые преобразуются в строки. переменная "strpoints" представляет собой список произвольной длины строк. input1 сообщает myprog длину strpoints. конечно, когда я пытаюсь запустить приведенный выше код, я получаю следующее сообщение об ошибке:

TypeError: Невозможно неявно преобразовать объект списка в str

как передать все элементы strpoints в myprog.exe? я обречен на необходимость делать str (strpoints) и затем myprog.exe анализирует это для запятых, апострофов и т. д.? например.,

`>>> x = ['a', 'b']

`>>> str (x)

"['a', 'b']"

или я должен заранее создать огромную строку? например.,

'>>> x = [' a ',' b ']

'>>> stringify (x)

'a b'

где stringify будет что-то вроде

<code>
def stringify(strlist):
    rlist = ""
    for i in strlist:
        rlist = rlist + i + " "
    return rlist

Ответы [ 4 ]

7 голосов
/ 11 сентября 2009

args может быть последовательностью:

p = subprocess.Popen(args = ["myprog.exe"] + 
                            [str(x) for x in [input1,input2,input3]] + 
                            strpoints,stdout = subprocess.PIPE)

Это более правильно, если ваши аргументы содержат метасимволы оболочки, например '* и вы не хотите, чтобы они интерпретировались как таковые.

4 голосов
/ 11 сентября 2009

Попробуйте использовать string.join:

p = subprocess.Popen(args = "myprog.exe" + " " +
                     str(input1) + " " +
                     str(input2) + " " +
                     str(input3) + " " +
                     " ".join(strpoints), stdout = subprocess.PIPE)
1 голос
/ 11 сентября 2009

Избегайте объединения всех аргументов в одну строку с использованием этой строки.

Намного проще, лучше и безопаснее просто передать последовательность (список или кортеж) аргументов. Это особенно верно, если любой аргумент содержит символ пробела (что довольно часто встречается в именах файлов).

0 голосов
/ 11 сентября 2009

Есть мысли, что вы можете заключить эти строки в кавычки, если в них есть пробелы? Что-то вроде:

if strpoints:
    finalargs = '"' + '" "'.join(strpoints) + '"'
else:
    finalargs = ""
p = subprocess.Popen(args = "myprog.exe" + " " +
                 str(input1) + " " +
                 str(input2) + " " +
                 str(input3) + " " +
                 finalargs, stdout = subprocess.PIPE)

Это удлиняет вашу строку, но сохраняет целостность ваших отдельных элементов в списке.

...