相对导入在交互式 Python 会话中不起作用,但我可以更改目录
os.chdir('..')
,然后 import module_in_parent
,然后返回 os.chdir('original_directory')
。或者对并行目录执行相同的操作。
这会被视为不好的做法吗?如果是,为什么? (我还没有真正见过它的使用,但我自己多次遇到这个问题。)
我在实验中使用了一些脚本和实用函数,希望保持文件夹结构不变,但也可以在新实验中重用一些脚本。
编辑:这是一个文件夹结构的示例:
project/
├── experiment
│ ├── main.py
│ └── utils
│ └── utils_functions.py
└── new_experiment
└── main2_.py
我想从 main2.py 导入
utils_functions
。我不想改变 experiment
中的任何内容。
@Random Davis:在上面的示例中,我使用 importlib 时收到错误
ImportError: attempted relative import beyond top-level package
。
我不是在开发具有单个入口点的程序,而是在进行一些数据分析,其中我使用多个短脚本来修改和可视化数据。
将目录添加到搜索路径很容易 - 实际上,我认为这比更改目录更容易。
虽然以这种方式更改目录在正在运行的程序中会非常非常糟糕,但在交互式会话中它只是很麻烦 - 所以,好吧,你做了一次,它做了你需要的,你做了两次 -好吧……但一遍又一遍地重复只是不行。
Python 查找要导入的文件的目录是一个简单的字符串列表,按照您想要的优先级顺序添加您想要的目录是很简单的:
>>> from pathlib import Path; import os, sys
>>> sys.path.insert(0, str(Path(os.getcwd()).parent())
将在Python路径中插入父目录以进行导入。无需更改工作目录。 (之后也可以将其从列表中删除)。另外,
pathlib.Path
杂耍只是为了能够使用.parent
- 人们可以做sys.path.insert(0, os.getcwd() + "/..")
- (而insert(0, ...)
只是常规列表的插入方法,将新路径放在位置0)