Python - фрагмент кода не работает на Python 2.5.6 с использованием IDLE
Я использую часть самоизменяющегося кода для проекта колледжа.
Вот:
import datetime
import inspect
import re
import sys
def main():
# print the time it is last run
lastrun = 'Mon Jun 8 16:31:27 2009'
print "This program was last run at ",
print lastrun
# read in the source code of itself
srcfile = inspect.getsourcefile(sys.modules[__name__])
f = open(srcfile, 'r')
src = f.read()
f.close()
# modify the embedded timestamp
timestamp = datetime.datetime.ctime(datetime.datetime.now())
match = re.search("lastrun = '(.*)'", src)
if match:
src = src[:match.start(1)] + timestamp + src[match.end(1):]
# write the source code back
f = open(srcfile, 'w')
f.write(src)
f.close()
if __name__=='__main__':
main()
К сожалению, это не работает. Ошибка вернулась:
# This is the script's output
This program is last run at Mon Jun 8 16:31:27 2009
# This is the error message
Traceback (most recent call last):
File "C:\Users\Rui Gomes\Desktop\teste.py", line 30, in <module>
main()
File "C:\Users\Rui Gomes\Desktop\teste.py", line 13, in main
srcfile = inspect.getsourcefile(sys.modules[__name__])
File "C:\Python31\lib\inspect.py", line 439, in getsourcefile
filename = getfile(object)
File "C:\Python31\lib\inspect.py", line 401, in getfile
raise TypeError('{!r} is a built-in module'.format(object))
TypeError: <module '__main__' (built-in)> is a built-in module
Буду благодарен за любые решения.
2 ответа
Он отлично работает при запуске вне IDLE - поэтому проблема не в вашем коде, а в среде, где вы его выполняете. Когда вы запускаете ошибочную часть вашего кода в IDLE, вы получаете такой вывод:
>>> import inspect
>>> sys.modules[__name__]
<module '__main__' from 'C:\Python26\Lib\idlelib\idle.pyw'>
>>> inspect.getsourcefile(sys.modules[__name__])
'C:\\Python26\\Lib\\idlelib\\idle.pyw'
Когда вы запускаете это в IDLE
# read in the source code of itself
srcfile = inspect.getsourcefile(sys.modules[__name__])
f = open(srcfile, 'r')
src = f.read()
f.close()
вы на самом деле пытаетесь изменить 'C:\\Python26\\Lib\\idlelib\\idle.pyw'
... который IDLE не позволит вам сделать.
Судя по всему, то, что вы написали , работает: но оно не может быть запущено в режиме IDLE.
Вы могли бы использовать __file__
глобальный атрибут, чтобы получить исходный путь текущего модуля.
Из 2.6 документов:
__file__
путь к файлу, из которого был загружен модуль, если он был загружен из файла.__file__
атрибут отсутствует для модулей C, которые статически связаны с интерпретатором; для модулей расширения, загружаемых динамически из общей библиотеки, это путь к файлу общей библиотеки.
РЕДАКТИРОВАТЬ:
Я сделал предположение, что inspect.getsourcefile() всегда будет выдавать TypeError при проверке __main__
модуль. Это только тот случай, когда запускается от интерактивного переводчика. Я стою исправлено. Derp.