我总是以下面的方式构建我的回购协议。
repo/main.py
repo/scripts/script.py
…
在www.example.com中main.py,我script.py按以下方式导入www.example.com:
from scripts import script as sc
除非我决定对script.py进行修改,否则这总是有效的。在进行修改之后,如果我从shell运行main.py,它仍然会从旧的www.example.com导入代码script.py不进行当前的修改。到目前为止,我所做的只是创建另一个分支。然而,这会导致开发过程中出现很多分支。2有什么方法可以避免这个问题吗?3我还应该如何从脚本目录导入来避免这个问题?
我们将非常感谢您的帮助。
UPDATE从答案中可以看出,我引起了一些混乱。当我说 * 我从shell运行main.py* 时,我的意思是从终端用python main.py
执行它。可以将 main.py 看作是一个执行一些数学运算并输出答案的脚本。在执行这些数学运算时,它从 scripts 导入 * script.py *,后者具有它(main.py)使用.在运行 main.py N次之后,如果我选择更新 script.py,然后再次执行 main.py(在终端中),它再次导入旧的 script.py,用旧的代码做数学运算,答案并不能反映我刚刚对 script.py 所做的修改,直到现在,我所做的,当我不得不经历这样的事情时,只需创建另一个新分支,并在新分支中复制粘贴旧文件和较新的 script.py,然后执行 main。py。它确实导入了较新的 * script.py *。我注意到的另一件事是,如果我只是创建一个新文件,比如说 script2.py,然后将其导入 main.py,作为
from scripts import script2 as sc
它导入了 script2.py-它反映了对 * script.py * 所做的所有更改。
- main.py * 中没有第二个 import 语句。
1条答案
按热度按时间xmd2e60i1#
从表面上看,这个问题听起来像是我们在重复运行
$ python main.py
,它会快速执行并退出。但从症状来看,一定是因为我们有一个长期的REPL提示符重复执行main.py代码。
您正在查找的模块是importlib。
请执行以下操作:
这是怎么回事?
如果你反复执行
第二次导入和随后的导入什么也没做,它查询
sys.modules
,发现模块 * 已经 * 被加载,并报告“cache hit!”,而不是执行拉入文本文件的艰苦工作。reload()
函数的用途是执行缓存失效并重复导入,因此它实际上是从(可能经过编辑的)源文件中提取python文本。假设你有一个短期的
$ python main.py
进程反复运行,有时是在script.py编辑之后,所以内存中的sys.module
缓存是不相关的,在每次进程退出时都被丢弃了,这里有另一层缓存在起作用。通常,cPython解释器会读取
script.py
,解析,从解析树中产生字节码,并将字节码写入script.pyc
。根据系统细节,可以有多个输出缓存目录。在被要求读取
script.py
时,解释器可以查看对应的.pyc
字节码文件是否可用并且是新的,然后声明“cache hit!",在这种情况下,甚至不读取.py
源文件。(人工编辑速度),文件时间戳的新鲜度比较有效,如果这些时间戳有问题,整个机制将无法正常工作,而且我们可能没有注意到来源是最近编辑的。也许你就是这样受苦的。首先,确定相关的
.pyc
字节码文件。然后,运行main,进行编辑,删除
.pyc
文件,重新运行main,注意编辑生效。怎么样。