在python中导入

Import in python

本问题已经有最佳答案,请猛点这里访问。

我读了很多关于我所问问题的答案,但我仍然不明白如何使我正在尝试的事情成为可能。所以我们来谈谈重点。我将报告我的应用程序的简化版本。

假设我有一个名为project的主文件夹,其中有一个包含三个子包的SRC主包:

  • 群集(包含文件:clustering.py)
  • 解析器(包含一个文件:parser.py)
  • 支持类(包含文件:myclass.py)

除项目一外,每个文件夹中都有一个

现在,集群和解析器包中包含的python脚本应该同时使用支持类中包含的myclass.py。

我尝试了相对导入,但它们不起作用,因为我想直接运行集群和解析器包中包含的脚本,并且不想使用-m选项。

锿。python parser.py[参数]

我使用的相对导入示例是:

1
from ..supportClass import myClass

我试图将包路径添加到sys.path,但有一些东西不起作用,因为它仍然告诉我它找不到模块。

锿。

1
2
sys.path.insert(0,"~/project/src")
from support_class import myClass.py

有人能在python2.7中建议最好的方法吗?如果我能避开sys.path选项,那就太好了,因为我不太喜欢这个解决方案。

事先谢谢。


让我们从项目的文件夹体系结构开始:

1
2
3
4
5
6
7
8
9
10
11
12
MyProject/
└── src
    ├── clustering
    │   ├── __init__.py
    │   └── clustering.py
    ├── parser
    │   ├── __init__.py
    │   └── parser.py
    ├── support_class
    │   ├── __init__.py
    │   └── support.py
    └── main.py

如果我没有弄错的话,你的问题是你想从parser.pyclustering.py内部进口support.py,并且在需要的时候能够独立运行这两个系统。两个字:

有条件导入

(还有一个,在找到了真正的其他解决方案之后;):PYTHONPATH

假设您的脚本有一个if __name__ =="__main__":部分来运行测试,您可以简单地将以下内容作为其导入:

clustering.py和parser.py:

1
2
3
4
5
6
7
8
9
10
11
if __name__ =="__main__":
    import sys
    import os

    PACKAGE_PARENT = '..'
    SCRIPT_DIR = os.path.dirname(os.path.realpath(os.path.join(os.getcwd(), os.path.expanduser(__file__))))
    sys.path.append(os.path.normpath(os.path.join(SCRIPT_DIR, PACKAGE_PARENT)))

    from support_class.support import Support
else:
    from support_class.support  import Support

MY.PY:

1
from support_class.support  import Support

然后,python clustering.pypython parser.py to your heart's content!

这是https://stackoverflow.com/a/16985066/3425488的副本


当您调用这样的python脚本时

1
python parser.py

该模块加载为__main__,而不是parser.parser。它不会作为任何包的一部分加载,因此不能进行相对导入。正确的方法是创建一个单独的脚本,该脚本仅用作主脚本,而不使用任何模块脚本作为主脚本。例如,创建这样的脚本

Me.Py

1
2
from parser import parser
parser.main()

然后你可以运行python /path/to/main.py,它就会工作。

另外,还有关于包布局的注释。在您的示例中,parserclusteringsupport_class不是子包,它们是顶级包。通常,如果您有一个名为project的包,并且您使用的是src目录,那么您的布局如下:

1
2
3
4
5
6
7
8
9
/project
  setup.py
  /src
    /project
      __init__.py
      /clustering
        __init__.py
      /parser
        ..

或者,如果您使用setup.py脚本构建实际的python包,则可以使用setuptools中的console_scripts入口点自动生成脚本。

1
2
3
4
5
6
7
setup(
    ...
    entry_points = {
        'console_scripts': ['myparser=project.parser:main'],
    }
    ...
)


首先,您必须在实际包所在的目录中创建一个uuinit uuy文件(两个="uuu",前后没有空格)。

第二,只需从导入到的python脚本调用包。

例如。:

my_script.py您希望在其中包含/导入包的脚本

  • 包含包文件的my_clustering_dir目录
  • my_clustering.py文件应该在my_clustering目录中
  • "uu init uuu".py确保此文件仅在我的群集目录中(可以为空)
  • 现在,您可以转到my_script.py。然后,您可以添加以下内容:

    1
     from my_clustering_dir import my_clustering  #no extension (.py) needed