2013-04-18 5 views
2

Я хочу, чтобы вызвать функцию питона pexpect.spawn(cmd), где ЦМД строка, как показано ниже:одиночные и двойные кавычки в питоне строках

ssh -t [email protected] 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"' 

IP-адрес постоянно меняется, так что это что-то вроде:

ssh -t [email protected]%s 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"' %host_ip 

есть несколько ' и ", я в недоумении, как справиться с этим так в основном, речь идет о том, как иметь дело с побегом в питоне строках и когда есть переменный подстрока, как бороться с ним

благодаря

ответ

7

вы можете использовать тройные кавычки:

"""ssh -t [email protected]{0} 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"'""".format(ip_address) 
+0

triple '' '?, почему не' ''''?? – misteryes

+4

либо один должен работать, я просто привык видеть двойники, используемые для тройных котировок –

+0

@misteryes, они оба работают, но с использованием трех '' 's гораздо более распространенный (или идиоматический) в существующем коде python. Это, конечно, не заставляет вас использовать это. :) –

0

Cameron Sparr уже дал общего назначения ответа.

Но в вашем конкретном случае вам, вероятно, это не понадобится.

pexpect.spawn принимает строку команд и аргументов или командную строку и список отдельных строк аргументов. И то же самое верно для большинства аналогичных методов в других библиотеках (например, в стандартной библиотеке subprocess).

Итак, вам нужно только, чтобы каждый аргумент в строку, как это:

pexpect.spawn('ssh', ['-t', '[email protected]', 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"']) 

На самом деле, документация конкретно предполагает, что это, именно по этой причине:

Вторая форма of spawn (где вы передаете список аргументов) полезно в ситуациях, когда вы хотите вызвать команду и передать ей свой собственный список аргументов . Это может сделать синтаксис более понятным.

Конечно, в вашем случае, вы на самом деле нерест команду со списком аргументов ... один из которых сам по себе является командой, чтобы метать икру и список аргументов (sudo), и так далее несколько шагов вниз линия (nohup, bash и, наконец, tcp_sender), и, очевидно, pexpect может помочь только с первого из этих шагов. К счастью, в этом случае это все, что вам нужно.

Если вы сделать нужно больше, есть некоторые библиотеки там, которые могут генерировать POSIX стиля строки в кавычках из списка аргументов (в основном реверсе shlex), но несколько раз я нужен один, то один Я обнаружил, что оказался ошибкой, и я в конечном итоге переписал его сам ... На самом деле это не так сложно (в основном, просто избегайте всего, а затем цитируйте все аргументы). Но, надеюсь, вам никогда не придется это делать.

Смежные вопросы