导入 python
Import in python
我阅读了很多与我提出的问题相关的答案,但我仍然不明白如何使我正在尝试的这件事成为可能。
那么让我们进入正题。我将报告我的应用程序的简化版本。
假设我有一个名为 project 的 main 文件夹,里面有一个 src main package包含 三个子包:
- 聚类(包含一个文件:clustering.py)
- 解析器(包含一个文件:parser.py)
- support_class(包含一个文件:myClass.py)
每个文件夹中,除了项目一,还有一个__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
- my_clustering_dir # 包含包文件的目录
- my_clustering.py # 文件应该在里面 my_clustering_dir
- "__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
就可以了。
此外,请注意您的包裹布局。在您的示例中,parser
和 clustering
以及 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.py
和 clustering.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.py
和python parser.py to your heart's content!
这使它成为
的副本
我阅读了很多与我提出的问题相关的答案,但我仍然不明白如何使我正在尝试的这件事成为可能。 那么让我们进入正题。我将报告我的应用程序的简化版本。
假设我有一个名为 project 的 main 文件夹,里面有一个 src main package包含 三个子包:
- 聚类(包含一个文件:clustering.py)
- 解析器(包含一个文件:parser.py)
- support_class(包含一个文件:myClass.py)
每个文件夹中,除了项目一,还有一个__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
- my_clustering_dir # 包含包文件的目录
- my_clustering.py # 文件应该在里面 my_clustering_dir
- "__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
就可以了。
此外,请注意您的包裹布局。在您的示例中,parser
和 clustering
以及 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.py
和 clustering.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.py
和python parser.py to your heart's content!
这使它成为
的副本