我有一个具有以下文件结构的项目:
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
通过调用root
从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上,所有三个import语句都能正确执行。在Windows上,前两个似乎执行正常,但在第三个我被告知:
ImportError: No module named 'parser.parser'; 'parser' is not a package
为什么它会在第三个import
语句中中断,为什么它只会在Windows上中断?
编辑:说明程序的运行方式
答案 0 :(得分:1)
确保您的parser
没有隐藏内置或第三方软件包/模块/库。
我不是百分之百地确定如何解决这个名称冲突的具体细节,但看起来你似乎可以a)。让您的模块被现有模块覆盖(看起来可能在您的Windows案例中发生),或b)。覆盖现有模块,这可能会导致错误。似乎 b 通常会让人们兴奋起来。
如果您认为某个模块可能会发生这种情况(似乎很可能使用parser
这样的名称),请尝试重命名模块。
有关详细信息和更常见的Python“导入陷阱”,请参阅this very nice article。
答案 1 :(得分:0)
将run.py放在根文件夹之外,这样你就可以在根文件夹旁边有run.py,然后在根文件夹中创建__init__.py
,并将导入更改为:
import root.parser.parser as p
或者只是重命名解析器模块。
无论如何,你应该小心命名,因为有一天你可能会弄乱你自己的东西。