我尝试了一些不同的技术来尝试做一些对我来说似乎可行的事情,但我想我错过了一些关于 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
空文件应该足以将该代码限定为“包”(或模块?不确定术语),但似乎我在如何管理相对路径方面缺少一些东西。
我读到过去人们使用 and 中的和其他函数来破解它,path
但根据官方文档(python 2.7 和 3.*),这应该不再需要了。import os
import sys
我做错了什么,如何实现打印modules/print_module.do_stuff
从“相对目录”中的脚本调用它的内容的结果job/
?