2015-08-18 2 views
-1

В моем питон скрипт у меня есть следующая строка -цитаты не Бейн сохраняемые эхо команды при выполнении из питона

oscmd = "sqlite3 $OMC_DB_DIR/.mcdata \"UPDATE IPADDRESS SET DESCRIPTION = 'NODE0' WHERE HOST LIKE '%-n1.%'\" >/dev/null" . 

Я выполнить эту команду с помощью subprocess.Popen. Всякий раз, когда команда выходит из строя, я хочу отобразить неудачную команду на консоли.

Итак, я oscmd_display= "echo \"" + oscmd + "\"". Я не просто использую печать, но использую эхо, потому что хочу, чтобы переменные среды, такие как $ OMC_DB_DIR, интерпретировались и отображали их фактические значения.

Однако, когда я бегу, и команда терпит неудачу, я получаю сообщение, как -

[ERROR ] Executing the following command failed : 
    sqlite3 /opt/store/.mcdata UPDATE IPADDRESS SET DESCRIPTION=NODE0 WHERE HOST LIKE %-n1.% >/dev/null 

, то есть, все цитаты сняли.

Я хочу сохранить как «и» кавычки в моей команде.

Может ли кто-нибудь предложить решение?

+0

Добавьте 'set -x;' в начало команды, и оболочка покажет вам строку при ее запуске. Вы не можете надежно вставить команду в строку и получить корректную работу котировки. Вы можете в основном сделать это для печати, но это не стоит. –

ответ

0

Попробуйте использовать тройные кавычки для внешних кавычек:

oscmd = """sqlite3 $OMC_DB_DIR/.mcdata \"UPDATE IPADDRESS SET DESCRIPTION = 'NODE0' WHERE HOST LIKE '%-n1.%'\" >/dev/null""" 
+0

не работает. Независимо от того, какие цитаты («», «», «» ») используются во внешнем oscmd = ... – trup

+0

Не работает. Независимо от того, какие цитаты (« »,« »,« »») используются в внешняя команда oscmd = ..., когда она, наконец, делает oscmd_display = "echo \" "+ oscmd +" \ "", команда интерпретируется как echo "sqlite3 $ OMC_DB_DIR/.mcdata" UPDATE IPADDRESS SET DESCRIPTION = ' NODE0 'WHERE HOST LIKE'% -n1.% '">/Dev/null" – trup

1

Вместо того, чтобы внедрить всю командную строку в одной строке, передать список, содержащий имя команды и аргументы subprocess.Popen.

p = subprocess.Popen(["sqlite3", 
         # I'm assuming this is an environment variable 
         os.environ['OMC_DB_DIR'] + "/.mcdata", 
         "UPDATE IPADDRESS SET DESCRIPTION = 'NODE0' WHERE HOST LIKE '%-n1.%'", 
         stdout=os.devnull]) 

(Если вы используете что-то раньше, чем Python 2.7, замените os.devnull с open('/dev/null', 'w').)

+0

Можем ли мы это сделать, не изменяя, как используется подпроцесс.Popen? – trup

+0

Я бы не стал. Не структурируйте свой код вокруг того, как вы хотите, чтобы сообщение журнала появилось. – chepner

0

Есть несколько уровней (де) процитировать происходит.

В простой SQL, строки должны использовать одиночные кавычки:

SELECT 'some string'; 

В оболочке кавычки используются для отключения специальных символов оболочки, поэтому они должны быть экранированы, чтобы в конечном итоге в вызываемой программе:

sqlite3 filename.db 'SELECT \'some string\';' 

в Python, вы должны бежать как обратный слэш и цитаты так, что они приведены в оболочке:

oscmd = 'sqlite3 filename.db \'SELECT \\\'some string\\\';\''; 

(Как смешивать ' и " остается в качестве упражнения ...)