колотите функциональную команду Python реализации

У меня есть это

python -c "import sys, urllib as ul; \
    print ul.quote('sample hihi ')"

Как может я переносить его в функцию удара, таким образом, я могу назвать его как функция как так:

urlencode('sample hihi ')

Спасибо

1
задан 14 January 2019 в 12:41

1 ответ

Необходимо передать аргументы функции в код Python как регулярные аргументы оболочки, к которым можно получить доступ там через sys.argv массив. В функции Bash к ее параметрам вызова можно получить доступ, например, через "$*", который возвращает все аргументы как единственный аргумент разделенной пробелами строки (как будто он был заключен в кавычки в целом, не отдельные маркеры).

Вот пример, который следует Вашему исходному коду:

urlquote() { python -c 'import sys, urllib as ul; print ul.quote(sys.argv[1])' "$*" ;}

Однако, поскольку поддержка Python 2 скоро закончится, вот лучший эквивалентный Python 3:

urlquote() { python3 -c 'import sys, urllib.parse as ul; print(ul.quote(sys.argv[1]))' "$*" ;}

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

$ urlquote "roses are red, violets are blue..."
roses%20are%20red%2C%20violets%20are%20blue...

Примечание: Непосредственно никогда не вводите аргументы оболочки в свою строку кода Python, как python -c "print('$x')", поскольку это могло привести к легко годным для использования угрозам безопасности, если Вы когда-нибудь планируете выполнить свою функцию на недоверяемом входе, позволяя людям выполнить произвольные команды!

Взгляните на этот пример оболочки, где я разрабатываю аргумент в переменной x способом выполнять системную команду uname (который безопасен и просто печатает "Linux", но можно сделать все здесь):

$ x="');import os;os.system('uname');('"

$ python3 -c "print('$x')"
Linux
4
ответ дан 3 December 2019 в 06:50

Другие вопросы по тегам:

Похожие вопросы: