Python正在查找一些而不是所有自定义包
我有一个文件结构如下的项目:Python正在查找一些而不是所有自定义包,python,windows,python-3.5,Python,Windows,Python 3.5,我有一个文件结构如下的项目: root/ run.py bot/ __init__.py my_discord_bot.py dice/ __init__.py dice.py # dice files help/ __init__.py help.py # help files parser/ __init__.
root/
run.py
bot/
__init__.py
my_discord_bot.py
dice/
__init__.py
dice.py
# dice files
help/
__init__.py
help.py
# help files
parser/
__init__.py
parser.py
# other parser files
程序通过调用python run.py
从根目录运行run.py
导入bot.my_discord_bot
,然后使用其中定义的类
文件bot/my_discord_bot.py
具有以下导入语句:
import dice.dice as d
import help.help as h
import parser.parser as p
在Linux上,所有三条导入语句都正确执行。在Windows上,前两个似乎运行良好,但在第三个上,我被告知:
ImportError: No module named 'parser.parser'; 'parser' is not a package
为什么它在第三个import
语句中中断,为什么它只在Windows上中断
编辑:说明程序的运行方式确保您的解析器
没有隐藏内置或第三方包/模块/库
我不是100%确定如何解决这个名称冲突的具体细节,但似乎你可以(可能)。使您的模块被现有模块覆盖(这似乎可能发生在您的Windows案例中),或b)。覆盖现有模块,这可能会导致错误。似乎b是人们经常绊倒的东西
如果您认为这可能发生在您的某个模块上(它的名称很可能类似于parser
),请尝试重命名您的模块
有关更多详细信息和更常见的Python“导入陷阱”,请参阅。将run.py放在根文件夹之外,这样您就可以在根文件夹旁边运行run.py,然后在根文件夹内创建\uu init\uuuuuuuuuuuuuuuuuuuuuuuuuuupy
,并将导入更改为:
import root.parser.parser as p
或者只是重命名您的解析器模块
无论如何,你应该小心命名,因为总有一天你会把自己的东西弄得一团糟。在Linux和Windows上有可能有不同的Python版本吗?如果是这样,您是否确实支持这两种导入?您提到前两个导入“似乎执行得很好”,但如果您将import parser.parser注释为p
行,其他导入是否成功?另外,在根目录中是否需要\uuu init\uuuuuuuuuuy.py
?@ele,而其他导入仍然成功,但有问题的导入被注释掉。如果我在根目录中添加一个\uuu init\uuuuuuuuuuuuuuuupy
,我也不会得到任何更改。PYTHONPATH环境变量中的“root”目录是否存在?另外,请再次检查解析器/
中的\uu init\uuuuuuuuuuuuuuuuuuuupy
中的是否没有发生任何问题,并且您没有跟踪内置库或第三方库。例如,如果我打开一个Python3解释器并执行import parser
操作,即使我自己没有创建一个名为parser
的包,也会成功。也许只是测试重命名包是否解决了问题。我知道它在Linux上成功了,但在Windows安装中可能有另一个名为parser
的包,但不是Linux包。