我运行的是Python 2.5。

这是我的文件夹树:

ptdraft/
  nib.py
  simulations/
    life/
      life.py

(我在每个文件夹中都有__init__.py,为了可读性,这里省略了)

我如何从生命模块内导入nib模块?我希望不需要修改sys.path就可以做到。

注意:正在运行的主模块在ptdraft文件夹中。


当前回答

pathlib库(包含在>= Python 3.4中)使得将父目录的路径附加到PYTHONPATH非常简洁和直观:

import sys
from pathlib import Path
sys.path.append(str(Path('.').absolute().parent))

其他回答

与图书馆合作。 创建一个名为nib的库,使用setup.py安装它,让它驻留在站点包中,这样你的问题就解决了。 你不需要把你做的所有东西都装在一个包里。把它拆成碎片。

在Linux系统中,您可以创建从“life”文件夹到nib.py文件的软链接。然后,你可以像这样简单地导入它:

import nib

在删除了一些系统路径黑客后,我认为添加它可能是有价值的

我喜欢的解决方案。

注意:这是一个框架挑战-没有必要在代码中做。

假设有一棵树,

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",
  ...
]

现在,从项目目录导入的所有内容都可以是绝对的。不需要再耍花招了。

这个问题似乎与模块位于父目录或类似的内容无关。

您需要将包含ptdraft的目录添加到PYTHONPATH

您说导入nib与您一起工作,这可能意味着您将ptdraft本身(而不是其父)添加到PYTHONPATH。

你可以使用相对导入(python >= 2.5):

from ... import nib

(Python 2.5新增功能)PEP 328:绝对和相对导入

编辑:增加了另一个点。“去送两个包裹