我正在为大学项目使用一段自修改代码。
这是:
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
我会感谢任何解决方案。
答案 0 :(得分:4)
在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中运行。
答案 1 :(得分:3)
您可以使用__file__
全局属性来获取当前模块的源路径。
来自2.6文档:
__file__
是加载模块的文件的路径名,如果 它是从一个文件加载的。该 静态链接的C模块不存在__file__
属性 进口翻译;用于扩展 从a动态加载的模块 共享库,它是路径名 共享库文件。
编辑:
我假设inspect.getsourcefile()在检查__main__
模块时总会抛出TypeError。这只是从交互式解释器运行时的情况。我纠正了。 DERP。