修改后的Python导入

r1zhe5dt  于 2023-02-01  发布在  Python
关注(0)|答案(1)|浏览(144)

我总是以下面的方式构建我的回购协议。

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 语句。
xmd2e60i

xmd2e60i1#

从表面上看,这个问题听起来像是我们在重复运行$ python main.py,它会快速执行并退出。
但从症状来看,一定是因为我们有一个长期的REPL提示符重复执行main.py代码。
您正在查找的模块是importlib
请执行以下操作:

from importlib import reload

from scripts import script as sc

# [do stuff, then edit script.py]

reload(sc)

# [do more stuff, and see the effect of the edit]

这是怎么回事?
如果你反复执行

import scripts.script
import scripts.script

第二次导入和随后的导入什么也没做,它查询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,注意编辑生效。
怎么样。

相关问题