python中,如果自己写的模块与系统模块重名,该怎么调用系统的模块?

如题,比如说,建了一个first文件夹,里面有个re.py,我在这个文件夹下还有一个main.py模块,当在main.py中:
import re
时,系统默认优先调用我自己写的re.py 模块,而不是正则表达式的re模块,这个应该怎么办才能使用系统自己的re模块?

sys.path是一个list,存放了当前所有import搜索的路径。

绝大多数情况下,首个元素是"",即空串,也就是说,当你import re的时候,首先搜索的是"re",这时候就会直接在当前目录搜索到re。如下图:

解决方法也有不止一个:

1,在当前目录创建一个子文件夹,例如mine,在mine里放一个__init__.py,不用有代码,空文件即可。使用的时候:import mine.re

2,在sys.path上做手脚,把第一个空串挪到最后面去:

import sys

sys.path = sys.path[1:]

sys.path.append("")

这样当前目录会跑到最后面去,从而达到最后搜索的目的。

不过这很可能有副作用,即你创建的模块,不能和前面搜索路径里的任何文件重名,否则会无法import你的模块。

这也是为什么默认把当前路径放在最前搜索的原因,因为是用户自己写的,显然优先级最高。


尽管就你的问题作出分析和提出一些可能的解决办法,但是严重不建议在实际工程起和系统模块重名的文件名,这是自找麻烦。

当然,研究探讨它的实现原理,始终是值得肯定的。

最后强调一下,当你在当前文件夹创建了一个sys.py时,方法2不好用!

追问

回答地很棒!包括最后一个提醒,其实我看到一半的时候就在想这个问题,结果你给回答了,哈哈哈。
实际使用的时候不用用这个名字,就是突然想起这个问题,想要找个解决的方案。
还有一个问题,我能不能使用绝对路径来表示我自己的re模块,在import绝对路径的时候,是必须把路径中的“\”改成"."吗?因为python导入包或模块的时候,好像没有看到有人用"\"的路径分段符。

追答

实际上路径分隔符可移植性几乎没有,windows \,linux /,作为一个脚本语言,从基础部分出现可移植性问题,不是个好的选择,这会导致大部分代码需要写两份来保证在不同系统下工作,试问哪个文件你不import几个模块?
很多语言都用.作为路径分隔,比如应用广泛的Java,其package也是由点分隔,至于其具体路径分隔是什么,由编译器或者解释器负责处理,屏蔽了平台的差异。
事实上你写 import a\b\c会导致语法错误,\是转义符还记得吗,写import a/b/c 也会导致语法错误,/除法运算,还记得吗

追问

另外,如果我作为一个编程者,不想通过手动的方法去查找绝对路径(因为考虑到整个工程移植到其它机器上运行的问题,移植后绝对路径就没有用了),可以通过sys模块找到目前自己位置的相对路径吗(然后作字符串的拼接)?我试过(没有找到查找自己路径的方法,但我先把自己的位置存储在一个变量里,这个变量放在import re之前),但好像在import阶段,不能使用变量所存储的字符串,报错:无法找到引用之类的话。

追答

1,通过os模块的getcwd,可以找到当前工作路径的绝对路径,此路径为入口py文件所在的路径。例如d:\my\workspace\test\main.py,代码内容如下:

import os
print(os.getcwd())
从命令行调用python main.py
输出为:“d:\\my\\workspace\\test”
当前工作路径的相对路径,永远是一个点("." or "./")

2,使用importlib,import关键字是语法糖,由importlib实现,大致代码如下:
import importlib
importlib.import_module("module", "package")
这类似于 from package import module,但是"module"处你可以使用变量

追问

hello,能不能再问一个问题:
#include
using namespace std;
int main() {
int m = '4';
char *a = (char *)&m;
cout << &a << endl;
printf("%x\n", a);
}
打印两次a的地址为啥不一样?

追答

&a是a的地址

a是a的值,这俩极大概率不一样,相等是小概率,或者刻意为之

温馨提示:答案为网友推荐,仅供参考
第1个回答  2022-06-16
不改名,确实不知道怎么处理。
但是,一般情况下,主动避免是一种比较明智的选择。即便能掌握导入模块时的搜索路径,但你并不能把控不同系统搜索时可能存在不同的策略。这样子还可能需要对不同的系统进行判断而使用不同的策略。没必要嘛。规避掉可以节省自己多少时间,为何非要在这里死磕呢?
而如果是将这些 python文件做成一个 package的话,倒是可以精确导入同名模块。可对于其他人来说,相同命名的模块可能会造成误解,增加理解代码的时间和成本。还是那句话,甚无必要。
多数情况下,为了必要重名都要将重名关键词后面主动加上后下划线。
个人之见,实在没有必要命名为重名。百害而无一利。追问

不是真的要这么用,就是探讨一下这个问题

第2个回答  2022-06-14
自己写的模块和python模块重名时,如果用import导入,优先导入的是自己写的 可以修改自己的模块名称追问

知道的,问题是如果不改名,改如何处理

相似回答