LINUX.ORG.RU

[python][поделие]подскажите с «subprocess.call»

 


0

1

Есть код

...
arguments = ["vim", "-d", "<(" + cvsCommand + fileName + ")", fileName]
subprocess.call(arguments)
...

которы должен в вимдифе открывать ванильный и модифицированный файлы.

перед исполнением «arguments» равно следующему

['vim', '-d', '<(svn cat build.properties)', 'build.properties']

если в консоли выполнить

vim -d <(svn cat build.properties) build.properties
то все работает, а если через скрипт - то в виме открывается «<(svn cat build.properties)» файл (новый)

PS: svn здесь как пример, у меня оно multi-(d)cvs

★★★★★

subprocess.call выполняет одну программу с передачей ей аргументов командной строки. А

vim -d <(svn cat build.properties) build.properties
- это целый shell-скрипт.

Deleted
()

Ты просто не понимаешь, как работает шелл. Попробуй:

arguments = [«sh», "-c", «vim -d <(» + cvsCommand + fileName + ")«]

P.S. camelCase не должен применяться в именах переменных.

tailgunner ★★★★★
()

Можно еще сделать так:

subprocess.call("vim -d <(%s %s) build.properties" % (cvs_command, file_name), shell=True)

Но я этого вам не говорил (это - не лучший способ).

P.S. читайте документацию

P.P.S. и PEP8

shylent
()

Лучше передавать в stdin процесса данные.

subprocess.call(arguments, stdin=myfunc), где myfunc - file-like объект, который по вызову myfunc.read() выдаст тебе этот svn cat.

Как-то так.

anonymous
()
Ответ на: комментарий от tailgunner

Ты просто не понимаешь, как работает шелл.

да. но сейчас мне нужна подсказка, а не чтение мана

arguments = [«sh», "-c", «vim -d <(» + cvsCommand + fileName + ")«]

не работает

vv@crusader ~/work/funambol/v91/ajax-portal $ cooldiff.py build.properties 
sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `vim -d <(svn cat build.properties) build.properties'

P.S. camelCase не должен применяться в именах переменных.

возможно. пришло с js. я уже понял, что нужно поcмотреть pep8

ZuBB ★★★★★
() автор топика
Ответ на: комментарий от shylent

Можно еще сделать так:

тоже не работает. разница с первой подсказкой «/bin/sh» <--> «sh»

vv@crusader ~/work/funambol/v91/ajax-portal $ cooldiff.py build.properties 
/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `vim -d <(svn cat  build.properties) build.properties'
vv@crusader ~/work/funambol/v91/ajax-portal $ 

ZuBB ★★★★★
() автор топика
Ответ на: комментарий от ZuBB

> да. но сейчас мне нужна подсказка, а не чтение мана

Тебе несколько человек дали подсказку - ты фактически должен передать шеллу однострочный скрипт. У тебя в этом однострочном скрипте ошибка, но отлаживать даже этот маленький фрагмент за тебя никто не будет.

tailgunner ★★★★★
()
Ответ на: комментарий от ZuBB

Решение в лоб os.system(«vim -d <(%s %s) build.properties» % (cvs_command, file_name))

Выполняется в шеле. Но будь бдителен. В переменной csv_command может оказаться и такое "); rm -rf / ;"

Yur4eg ★★
()
Ответ на: комментарий от Yur4eg

Не в лоб, а вообще не понятно куда. Зачем ваш os.system, если есть subprocess.call(..., shell=True)? Там же даже в документации сказано, что вместо os.system и всяких там os.popen* нужно использовать subprocess.

shylent
()
Ответ на: комментарий от tailgunner

это я понял сразу, как замена сработала

ZuBB ★★★★★
() автор топика

так, какой вариант наиболее правильный?

// меня устраивает и current way, но просто интересно же :)

ZuBB ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.