2015-12-30 3 views
2

Python новичок здесь.Почему диспетчер задач не запускает некоторые строки кода в сценарии?

У меня есть скрипт Python, который выполняет некоторое управление базой геоданных (примиряет/публикует версии, сжимает и т. Д.). У меня есть следующие строки кода в моем сценарии:

createLog = open(str(datetime.date.today()) + ".txt", "w") 

вдоль каждого шага сценария я добавить в текстовый файл со следующими утверждениями:

createLog.write("Database connections blocked.\n") 

При запуске сценария в моем IDE (PyCharm) Я получаю желаемый результат: текстовый файл с каждым шагом, записанным в файл .txt. Когда я запускаю его в Task Scheduler, файл .txt не создается и, следовательно, не регистрируется. Все остальное работает, насколько я могу судить. Я могу отслеживать изменения, внесенные в данные.

Я уже сталкивался с подобными задачами с планировщиком задач, но в прошлом так и не смог решить проблему.

Любые идеи?

ответ

1

Я думаю, что это проблема рабочего каталога. Открытая функция Python открывает файл в текущем рабочем каталоге, а не в той же папке, что и скрипт. Это распространенное заблуждение! (Который смутил меня целую вечность при изучении Python ...)

Итак, что такое рабочий каталог? Хорошо, чтобы процитировать моего хорошего друга. Википедия:

При вычислении рабочий каталог процесса представляет собой каталог иерархической файловой системы, если таковой имеется, [1], динамически связанный с каждым процессом. Когда процесс относится к файлу с использованием простого имени файла или относительного пути (в отличие от файла, указанного полным путем из корневого каталога), ссылка интерпретируется относительно текущего рабочего каталога процесса. Так, например, процесс с рабочим каталогом/кроличьей обуви, который просит создать файл foo.txt, в конечном итоге приведет к созданию файла /rabbit-shoes/foo.txt.

(Источник: https://en.wikipedia.org/wiki/Working_directory)

Так как выбран этот рабочий каталог?

Ну, это выбрано родительским процессом этих процессов! Когда вы запускаете программу из оболочки, такой как bash, оболочка (родительский процесс) помогает установить рабочий каталог выполняемой вами программы (дочерний процесс) в каталог, в котором вы сейчас находитесь. (То есть каталог, который вы cd 'd.)

Поскольку ваша IDE умна и полезна, она запускает процесс скрипта Python и устанавливает рабочий каталог в том же месте, где находится сам сценарий. Планировщик задач менее полезен ... Я абсолютно не понимаю, к чему он настраивает рабочий каталог. Однако, если вы будете искать в своей системе, я уверен, что вы найдете файл журнала где-то где-то!

+0

Это было! Теперь я знаю, и ты спас мне много будущей головной боли. –

+0

Не только Python. Я не могу придумать какие-либо общие языки программирования, которые по умолчанию использовали бы относительные пути из двоичного кода вместо относительных путей из рабочего каталога. – ShadowRanger

+0

@ShadowRanger Да, я это знаю. Я думаю, что в ответе довольно ясно, что это не просто вещь Python. Но если вы считаете, что это неясно, тогда отредактируйте! – Others