Python 从包的{in,out}侧导入

Python 从包的{in,out}侧导入,python,import,Python,Import,我有一个项目,我在一个我正在并行构建的库上构建。结构如下: project/ main.py MyLibrary/ __init__.py --> empty Module1.py --> contain the class Class1 Module2.py --> contain the class Class2 Module3.py --> contain the class Class3 ... 如

我有一个项目,我在一个我正在并行构建的库上构建。结构如下:

project/
  main.py
  MyLibrary/
    __init__.py --> empty
      Module1.py --> contain the class Class1
      Module2.py --> contain the class Class2
      Module3.py --> contain the class Class3
      ...
如果需要,我需要将类Class2导入Class1.py

from Module1 import Class1
没关系。但在project/main.py中时,我会这样做

from MyLibrary import Module1
我得到一个警告:没有模块名Module1

我可以通过替换以下内容来解决此问题:

from Module1 import Class1

但是我不能再直接运行Module1.py了(Python抱怨我试图对非包产生相对影响…)。我需要它来运行测试

我怎么能在两种情况下都导入该工作

谢谢你的关注


编辑:第一个描述的解决方案似乎适用于我的linux桌面,但不适用于我的windows Xp笔记本电脑。这很奇怪…

您所经历的行为(导入在一台机器上正常工作,而不是在另一台机器上正常工作)经常发生,因为您在一个系统上有多个名为MyLibrary的包,而PYTHONPATH没有首先列出“.”

要测试这是否是问题所在,请在项目目录中运行Python并执行以下操作

>>> import MyLibrary
>>> print MyLibrary
看看我的图书馆是否符合你的期望。如果没有,调整PYTHONPATH和/或删除包的过时版本


避免这类问题的一种常见方法是使用virtualenv创建一个孤立的Python环境。

使用这些名称,很难说您是否试图从模块内部导入模块(最佳实践)或类(不太热门),以及您得到了什么。此外,除了短暂提到Class2之外,到处使用“Class1”都会让人头痛。请进行一些合理的重命名(例如模块的Mod1、Mod2!),并澄清您正试图导入哪些模块、从何处导入、sys.path上的内容以及当前目录。您正在编写您想要“将类2导入Class1.py”的文件。但是,您可以尝试使用Class1 import Class1中的
来实现这一点。这是没有意义的。我的坏朋友,为了更清晰,我更改了模块名称(我希望如此)。
>>> import MyLibrary
>>> print MyLibrary