Ваш файл пуст во время работы программы:
fd = open(file_name,"w")
fd.write("#!/usr/local/bin/tcsh -f\n")
fd.write("echo 'PRINT FROM CMD_FILE_FROM_PYTHON'\n")
fd.close
Обратите внимание на отсутствие паренсов вызовов на fd.close
; вы на самом деле никогда не закрывали файл, поэтому, скорее всего, все содержимое файла находилось в буфере Python и никогда не попадало на диск до тех пор, пока программа не закончилась (когда ссылочный интерпретатор CPython, как деталь реализации, проходит и очищает глобальные переменные, закрывая открытые файлы для вас побочным эффектом, он может никогда не достигнуть диска в другом интерпретаторе).
Чтобы исправить, на самом деле позвоните close
. Или, что еще лучше, переключитесь на более безопасный подход with
к выражению , где close
является неявным и автоматическим, происходит даже в том случае, если исключение или return
заставляет вас досрочно выйти из кода: [ 1110]
with open(file_name, "w") as fd:
fd.write("#!/usr/local/bin/tcsh -f\n")
fd.write("echo 'PRINT FROM CMD_FILE_FROM_PYTHON'\n")
# No need to call close; file is guaranteed closed when you exit with block
Бумага, на которую указывает Логан, является большой, но это немного трудно. (Просто спросите моих студентов.) Это также много о, 'как потоковый сплав работает' и только часть, 'что потоковый сплав и как можно использовать его'.
проблема, которую решает потоковый сплав, состоит в том, что функциональные коды, как пишется часто выделяют промежуточные списки, например, для создания бесконечного списка чисел узла, Вы могли бы записать
nodenames = map ("n"++) $ map show [1..]
, Наивный код выделит бесконечный список целых чисел [1, 2, 3, ...]
, бесконечный список строк ["1", "2", "3", ...]
и в конечном счете бесконечный список имен ["n1", "n2", "n3", ...]
. Это - слишком много выделения.
то, Что делает потоковый сплав, переводят определение как nodenames
во что-то, что использует рекурсивную функцию, которая выделяет только, что необходимо для результата. В целом устранение выделения промежуточных списков называют вырубка леса .
Для использования потокового сплава необходимо записать нерекурсивные функции списка , которые используют функции из библиотеки потокового сплава, описанной в билет 915 GHC (map
, foldr
, и так далее) вместо явной рекурсии. Эта библиотека содержит новые версии всех функций Вводной части, которые были переписаны для использования потокового сплава. По-видимому, этот материал намечен для превращения его в следующий выпуск (6.12) GHC, но не находится в текущей стабильной версии (6.10). Если Вы хотите использовать библиотеку Porges, имеет хорошее простое объяснение в его ответе.
, Если Вы на самом деле хотите объяснение того, как потоковый сплав работает, отправьте другой вопрос---, но это намного более твердо.
Насколько я знаю, и вопреки тому, что сказал Norman, потоковый сплав не в настоящее время реализован в основе GHC (т.е. Вы не можете только использовать функции Вводной части). Для получения дополнительной информации см. билет 915 .
GHC Для использования потокового сплава, необходимо установить библиотеку потокового сплава, импортировать Данные. Список. Поток (можно также импортировать Управление. Монада. Поток), и только используют функции от того модуля, а не функции Вводной части. Это означает импортировать Вводную часть, скрывающую все функции списка по умолчанию и не использующую [x.. y] конструкции или понимание списка.
Разве это не правильно, что когда GHC в 6.12 использует эти новые функции по умолчанию, они также будут реализовывать [x..y] и перечислять понимания таким нерекурсивным способом? Потому что единственная причина, по которой они находятся в неправильном ряду, заключается в том, что они внутренние и на самом деле написаны не на Haskell, а больше похожи на ключевые слова, ради скорости и / или потому что вы не сможете переопределить это синтаксис.