【发布时间】:2017-08-10 22:42:28
【问题描述】:
我尝试了一些不同的技术来尝试做一些对我来说似乎可行的事情,但我想我错过了一些关于 python 的陷阱(使用 2.7,但如果可能的话,我希望这也适用于 3.*)。
我不确定包或模块之类的术语,但对我来说,以下似乎是一个非常“简单”的可行方案。
这是目录结构:
.
├── job
│ └── the_script.py
└── modules
├── __init__.py
└── print_module.py
the_script.py的内容:
# this does not work
import importlib
print_module = importlib.import_module('.print_module', '..modules')
# this also does not work
from ..modules import print_module
print_module.do_stuff()
print_module的内容:
def do_stuff():
print("This should be in stdout")
我想将所有这些“相对路径”的东西运行为:
/job$ python2 the_script.py
但是importlib.import_module 给出了各种错误:
- 如果我只使用 1 个输入参数
..modules.print_module,那么我得到:TypeError("relative imports require the 'package' argument") - 如果我使用 2 个输入参数(如上例所示),那么我得到:
ValueError: Empty module name
另一方面,使用from ..modules 语法我得到:ValueError: Attempted relative import in non-package。
我认为 __init__.py 空文件应该足以将该代码限定为“包”(或模块?不确定术语),但我似乎缺少关于如何管理相对路径的一些东西。
我读到过去人们使用path 和import os 和import sys 中的其他函数来破解它,但根据官方文档(python 2.7 和 3.*),这应该不再需要了.
我做错了什么,如何实现打印内容modules/print_module.do_stuff 从“相对目录”job/ 中的脚本调用它的结果?
【问题讨论】:
-
为什么要在这里使用 importlib?为什么不直接导入呢?
-
__init__.py只为其所在的目录创建一个包。您需要将__init__.py添加到您显示的树中的所有 目录中。您还需要确保包含顶级包目录的目录位于sys.path上,并且如果您希望能够将其中一个文件作为脚本执行,则需要考虑所描述的问题@ 987654321@ 和 here.
标签: python relative-path python-module python-packaging