module reimported if imported from different path(如果从不同路径导入,则重新导入模块)
本文介绍了如果从不同路径导入,则重新导入模块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在我工作的一个大型应用程序中,几个人以不同的方式导入相同的模块。 导入x 或 从y导入x 这样做的副作用是x被导入两次,如果有人依赖全局属性,可能会引入非常细微的错误例如,假设我有一个包mypakage,其中包含三个文件mymode.py、main.py和init.py
mymode.py内容
l = []
class A(object): pass
main.py内容
def add(x):
from mypackage import mymodule
mymodule.l.append(x)
print "updated list",mymodule.l
def get():
import mymodule
return mymodule.l
add(1)
print "lets check",get()
add(1)
print "lets check again",get()
打印
updated list [1]
lets check []
updated list [1, 1]
lets check again []
因为现在在两个不同的模块中有两个列表,所以A类也是不同的
对我来说,它看起来足够严重,因为课程本身将受到不同的对待
例如,下面的代码打印错误
def create():
from mypackage import mymodule
return mymodule.A()
def check(a):
import mymodule
return isinstance(a, mymodule.A)
print check(create())
问题:
有什么方法可以避免这种情况吗?除了强制执行该模块外,应该单向导入该模块。这难道不能通过Python导入机制来处理吗?我在Django代码和其他地方也看到了几个与此相关的错误。
推荐答案
只有在您实际运行的文件是main.py时,我才能复制它。在这种情况下,您将获得sys路径上的main.py的当前目录。但您显然也设置了系统路径,以便可以导入mypackage。
在这种情况下,Python将不会意识到myModule和mypackage.mymodule是同一个模块,您会得到这种效果。此更改说明了这一点:def add(x):
from mypackage import mymodule
print "mypackage.mymodule path", mymodule
mymodule.l.append(x)
print "updated list",mymodule.l
def get():
import mymodule
print "mymodule path", mymodule
return mymodule.l
add(1)
print "lets check",get()
add(1)
print "lets check again",get()
$ export PYTHONPATH=.
$ python mypackage/main.py
mypackage.mymodule path <module 'mypackage.mymodule' from '/tmp/mypackage/mymodule.pyc'>
mymodule path <module 'mymodule' from '/tmp/mypackage/mymodule.pyc'>
但在currect目录中添加另一个主文件:
realmain.py:
from mypackage import main
和结果不同:
mypackage.mymodule path <module 'mypackage.mymodule' from '/tmp/mypackage/mymodule.pyc'>
mymodule path <module 'mypackage.mymodule' from '/tmp/mypackage/mymodule.pyc'>
所以我怀疑您的主python文件在包中。在这种情况下,解决方案是不要这样做。:-)
这篇关于如果从不同路径导入,则重新导入模块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:如果从不同路径导入,则重新导入模块


猜你喜欢
- python-m http.server 443--使用SSL? 2022-01-01
- python check_output 失败,退出状态为 1,但 Popen 适用于相同的命令 2022-01-01
- 如何在 python3 中将 OrderedDict 转换为常规字典 2022-01-01
- pytorch 中的自适应池是如何工作的? 2022-07-12
- 使用Heroku上托管的Selenium登录Instagram时,找不到元素';用户名'; 2022-01-01
- 沿轴计算直方图 2022-01-01
- 如何在 Python 的元组列表中对每个元组中的第一个值求和? 2022-01-01
- 如何将一个类的函数分成多个文件? 2022-01-01
- 分析异常:路径不存在:dbfs:/databricks/python/lib/python3.7/site-packages/sampleFolder/data; 2022-01-01
- padding='same' 转换为 PyTorch padding=# 2022-01-01