导入 python

Import in python

我阅读了很多与我提出的问题相关的答案,但我仍然不明白如何使我正在尝试的这件事成为可能。 那么让我们进入正题。我将报告我的应用程序的简化版本。

假设我有一个名为 projectmain 文件夹,里面有一个 src main package包含 三个子包:

每个文件夹中,除了项目一,还有一个__init__.py

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

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

Es。 python parser.py [参数]

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

from ..supportClass import myClass

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

Es。

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

任何人都可以建议在 python 2.7 中执行此操作的最佳方法吗? 如果我可以避免 sys.path 选项,那就太好了,因为我不太喜欢这个解决方案。

提前致谢。

首先,您必须在您拥有实际包的目录中创建一个 __init __.py(两个 =“_”,前后没有空格)文件。

其次,您只想从要导入到的 python 脚本中调用您的包。

例如:

my_script.py #your script where you want to include/import your package

  1. my_clustering_dir # 包含包文件的目录
  2. my_clustering.py # 文件应该在里面 my_clustering_dir
  3. "__init __".py # 确保此文件仅在 my_clustering_dir 中(可以为空)

现在,您可以前往 my_script.py。然后,您可以添加以下内容:

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

当您像这样调用 python 脚本时

python parser.py

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

main.py

from parser import parser
parser.main()

然后你可以 运行 python /path/to/main.py 就可以了。

此外,请注意您的包裹布局。在您的示例中,parserclustering 以及 support_class 不是子包,它们是顶级包。通常,如果您有一个名为 project 的包并且您正在使用 src 目录,您的布局将如下所示:

/project
  setup.py
  /src
    /project
      __init__.py
      /clustering
        __init__.py
      /parser
        ..

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

setup(
    ...
    entry_points = {
        'console_scripts': ['myparser=project.parser:main'],
    }
    ...
)

让我们从项目的文件夹架构开始:

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:

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

main.py:

from support_class.support  import Support

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

这使它成为

的副本