我运行的是Python 2.5。
这是我的文件夹树:
ptdraft/
nib.py
simulations/
life/
life.py
(我在每个文件夹中都有__init__.py,为了可读性,这里省略了)
我如何从生命模块内导入nib模块?我希望不需要修改sys.path就可以做到。
注意:正在运行的主模块在ptdraft文件夹中。
我运行的是Python 2.5。
这是我的文件夹树:
ptdraft/
nib.py
simulations/
life/
life.py
(我在每个文件夹中都有__init__.py,为了可读性,这里省略了)
我如何从生命模块内导入nib模块?我希望不需要修改sys.path就可以做到。
注意:正在运行的主模块在ptdraft文件夹中。
当前回答
你可以在“模块搜索路径”中使用OS依赖路径。路径。 因此,您可以轻松地添加如下父目录
import sys
sys.path.insert(0,'..')
如果要添加父-父目录,
sys.path.insert(0,'../..')
这在python2和python3中都适用。
其他回答
二线最简解
import os, sys
sys.path.insert(0, os.getcwd())
如果父目录是你的工作目录,你想从子脚本调用另一个子模块。
您可以在任何脚本中从父目录导入所有子模块并执行
python child_module1/child_script.py
你可以使用相对导入(python >= 2.5):
from ... import nib
(Python 2.5新增功能)PEP 328:绝对和相对导入
编辑:增加了另一个点。“去送两个包裹
在删除了一些系统路径黑客后,我认为添加它可能是有价值的
我喜欢的解决方案。
注意:这是一个框架挑战-没有必要在代码中做。
假设有一棵树,
project
└── pkg
└── test.py
test.py包含什么
import sys, json; print(json.dumps(sys.path, indent=2))
使用路径执行只包括包目录
python pkg/test.py
[
"/project/pkg",
...
]
但是使用module参数会包含项目目录
python -m pkg.test
[
"/project",
...
]
现在,从项目目录导入的所有内容都可以是绝对的。不需要再耍花招了。
与图书馆合作。 创建一个名为nib的库,使用setup.py安装它,让它驻留在站点包中,这样你的问题就解决了。 你不需要把你做的所有东西都装在一个包里。把它拆成碎片。
我有一个专门针对git存储库的解决方案。
首先,我使用sys.path.append('..')和类似的解决方案。如果你导入的文件本身使用sys.path.append('..')导入文件,这会导致特别的问题。
然后我决定总是附加git存储库的根目录。在一行中是这样的:
sys.path.append(git.Repo('.', search_parent_directories=True).working_tree_dir)
或者更详细一点,像这样:
import os
import sys
import git
def get_main_git_root(path):
main_repo_root_dir = git.Repo(path, search_parent_directories=True).working_tree_dir
return main_repo_root_dir
main_repo_root_dir = get_main_git_root('.')
sys.path.append(main_repo_root_dir)
对于最初的问题:根据存储库的根目录,导入将是
import ptdraft.nib
or
import nib