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 |
如果我没有弄错的话,你的问题是你想从
(还有一个,在找到了真正的其他解决方案之后;):
假设您的脚本有一个
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 |
然后,
这是https://stackoverflow.com/a/16985066/3425488的副本
当您调用这样的python脚本时
1 | python parser.py |
该模块加载为
Me.Py
1 2 | from parser import parser parser.main() |
然后你可以运行
另外,还有关于包布局的注释。在您的示例中,
1 2 3 4 5 6 7 8 9 | /project setup.py /src /project __init__.py /clustering __init__.py /parser .. |
或者,如果您使用
1 2 3 4 5 6 7 | setup( ... entry_points = { 'console_scripts': ['myparser=project.parser:main'], } ... ) |
首先,您必须在实际包所在的目录中创建一个uuinit uuy文件(两个="uuu",前后没有空格)。
第二,只需从导入到的python脚本调用包。
例如。:
my_script.py您希望在其中包含/导入包的脚本
现在,您可以转到my_script.py。然后,您可以添加以下内容:
1 | from my_clustering_dir import my_clustering #no extension (.py) needed |