2014-10-09 2 views
1

При использовании команд оболочки bash иногда бывает полезно подключиться к python и написать короткую программу, а затем, возможно, передать это во что-то другое. Я не нахожу много документации о написании таких программ на Python, хотя это похоже на опцию «-c» - это возможность использовать ... но при написании даже самой простой программы python компилятор, или я должен сказать, что интерпретатор жалуется. Смотрите пример ниже:.Написание сценариев python непосредственно в командной строке

$ python -c " 
import os 

if os.path.isfile("test"): 
    print "test is a file" 
else: 
    print "test is not a file" 
" 

При вводе последнего "интерпретатор жалуется Это прекрасно работает, если я положил его в файле, но если я типа это так в командной строке я получаю ошибку

$ python -c " 
import os 

if os.path.isfile("test"): 
    print "test is a file" 
else: 
    print "test is not a file" 
" 
Traceback (most recent call last): 
    File "<string>", line 4, in <module> 
NameError: name 'test' is not defined 
.

Я понятия не имею, почему интерпретатор жалуется здесь кто-то знает, почему это разве работает

Что им действительно после того, как что-то вроде этого:.?

$ cat somefile | python -c " 
import re 

check = re.search(pattern, <file input>) 
" 

Я не знаю, как получить доступ к выводам кошки в этой ситуации, поэтому я просто написал это буквально.

ответ

4

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

python -c ' 
import os 

if os.path.isfile("test"): 
    print "test is a file" 
else: 
    print "test is not a file" 
' 

Если вы используете одиночные кавычки, чтобы закончить строку вы проходящая в питон, убедитесь, что только использовать двойные кавычки в коде. Кроме того, если вы можете гарантировать наличие Bash в качестве оболочки, вы можете получить добавили удивительные очки using heredoc format вместо:

$ python <<EOF 
> print "I can put python code here" 
> EOF 
I can put python code here 
+2

И, делая так, не забудьте только использовать двойные кавычки ('" ') вокруг строки в сценарии, а не одиночные кавычки (' ' '). Одиночные кавычки закончится сценарий резко и оставить оболочку, чтобы попытаться интерпретировать остальное. – cxw

+0

Или избежать одиночных кавычек с '\' – Barranka

+0

Да, спасаясь бы работать, мне грустно, потому что вещи не читаемые тогда. – ErlVolton

0

Либо использовать одиночные кавычки заключить вашу короткую программу или, если вы хотите использовать двойные кавычки заключите его, выйдите из котировок с \.

Примеры:

1. Экранирование цитата

$ python -c " 
print \"hello\" 
for i in (1,2,3): 
    print i 
" 

Выход:

hello 
1 
2 
3 

2. С одинарными кавычками

$ python -c ' 
print "hello" 
for i in (1,2,3): 
    print i 
' 

Конечно, если вы используете одинарные кавычки, чтобы вложить свою программу, и вы хотите использовать одиночные кавычки внутри код питона, вы будете иметь, чтобы избежать их \ ;-).

Выход такой же.

1

Другое решение состоит в том, чтобы избежать внутренних двойных кавычек, поэтому bash не анализирует их. Как это:

$ python -c " 
import os 

if os.path.isfile(\"test\"): 
    print \"test is a file\" 
else: 
    print \"test is not a file\" 
" 
0

Вы можете использовать то, что обычно называют «here document» (как в «использовать документ, который прямо здесь»).Это позволяет избежать всех цитирования проблем при использовании python -c "..." или python -c '...'

Например:

#!/bin/sh 
python <<EOF 
print "hello" 
for i in (1,2,3): 
    print i 
EOF 

«здесь документ» принимает произвольный маркер («EOF» является общим выбором, но это может быть любой строкой, которую вы знаете, не происходит нигде в данных), и принимает все данные до него, находит строку, содержащую этот маркер.

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