Вот сводка способов назвать внешние программы и преимущества и недостатки каждого:
os.system("some_command with args")
передачи команда и аргументы оболочке Вашей системы. Это хорошо, потому что можно на самом деле выполнить несколько команд сразу этим способом и настроить перенаправление ввода/вывода и каналы. Например:
os.system("some_command < input_file | another_command > output_file")
Однако, в то время как это удобно, необходимо вручную обработать выход символов оболочки, таких как пробелы, и т.д. С другой стороны, это также позволяет Вам команды выполнения, которые являются просто командами оболочки и не на самом деле внешними программами. См. документация .
stream = os.popen("some_command with args")
сделает то же самое как os.system
за исключением того, что оно дает Вам подобный файлу объект, который можно использовать для доступа к стандартному вводу/выводу для того процесса. Существует 3 других варианта popen что весь дескриптор i/o немного по-другому. Если Вы передаете все как строку, то Ваша команда передается оболочке; при передаче их как списка затем, Вы не должны волноваться о выходе ни из чего. См. документация .
Popen
класс subprocess
модуль. Это предназначается как замена для [1 110], но имеет оборотную сторону того, чтобы быть немного более сложным на основании того, чтобы быть настолько всесторонним. Например, Вы сказали бы:
print subprocess.Popen("echo Hello World", shell=True, stdout=subprocess.PIPE).stdout.read()
вместо:
print os.popen("echo Hello World").read()
, но хорошо иметь все опции там в одном объединенном классе вместо 4 различных функций popen. См. документация .
Эти call
функция от subprocess
модуль. Это в основном точно так же, как Popen
класс и берет все те же аргументы, но он просто ожидает, пока команда не завершает и дает Вам код возврата. Например:
return_code = subprocess.call("echo Hello World", shell=True)
См. документация .
, Если Вы находитесь на Python 3.5 или позже, можно использовать новое subprocess.run
функция, которая много похожа на вышеупомянутое, но еще более гибкий и возвращается CompletedProcess
объект, когда команда заканчивает выполняться.
модуль OS также имеет все функции ветвления/должностного лица/икры, которые Вы имели бы в программе C, но я не рекомендую использовать их непосредственно.
subprocess
модуль должен, вероятно, быть тем, что Вы используете.
Наконец знать, что для всех методов, куда Вы передаете заключительную команду, которая будет выполняться оболочкой как, строка и Вы ответственна за выход из него. существуют серьезные последствия безопасности , если какой-либо части строки, которую Вы передаете, нельзя полностью доверять. Например, если пользователь вводит некоторую/любую часть строки. Если Вы не уверены, только используйте эти методы с константами. Чтобы дать Вам подсказку последствий рассматривают этот код:
print subprocess.Popen("echo %s " % user_input, stdout=PIPE).stdout.read()
и предполагают, что пользователь входит, что-то "моя мама не любило меня & & комната-rf /" который мог стереть целую файловую систему.
Ну ... если вы хотите быть техническим, это функциональный литерал, который транслируется во время выполнения в закрытие, закрывая открытые термины (привязывая их к val / var в области видимости). функционального литерала). Кроме того, в контексте этого литерала функции ( _. Sales> = threshold
), threshold
является свободной переменной , поскольку сам функциональный литерал не придать ему какой-либо смысл. Само по себе _. Sales> = threshold
является открытым термином Во время выполнения он привязывается к локальной переменной функции при каждом вызове функции.
Take эта функция, например, генерирует замыкания:
def makeIncrementer(inc: Int): (Int => Int) = (x: Int) => x + inc
Во время выполнения следующий код создает 3 замыкания. Это' s также интересно отметить, что b и c не являются одним и тем же закрытием ( b == c
дает false
).
val a = makeIncrementer(10)
val b = makeIncrementer(20)
val c = makeIncrementer(20)
Я все еще думаю, что пример, приведенный в Википедии, является хорошим , хотя и не в полной мере. Довольно сложно привести пример фактического закрытия по самому строгому определению без фактического дампа памяти запущенной программы. То же самое и с отношением класс-объект. Обычно вы даете пример объекта, определяя класс Foo {...
а затем создать его экземпляр с помощью val f = new Foo
, заявив, что f является объектом.
- Flaviu Cipcigan
Примечания:
Я не совсем уверен, но думаю, что вы правы. Разве закрытие не требует состояния (я думаю, свободные переменные ...)?
Или, может быть, bookList - это свободная переменная?