我运行的是Python 2.5。

这是我的文件夹树:

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

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

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

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


当前回答

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

import nib

其他回答

你可以在“模块搜索路径”中使用OS依赖路径。路径。 因此,您可以轻松地添加如下父目录

import sys
sys.path.insert(0,'..')

如果要添加父-父目录,

sys.path.insert(0,'../..')

这在python2和python3中都适用。

我建这个图书馆就是为了做这个。

https://github.com/fx-kirin/add_parent_path

# Just add parent path
add_parent_path(1)

# Append to syspath and delete when the exist of with statement.
with add_parent_path(1):
   # Import modules in the parent path
   pass

上面提到的解决方案也很好。这个问题的另一个解决方案是

如果你想从顶级目录导入任何东西。然后,

from ...module_name import *

此外,如果您想从父目录导入任何模块。然后,

from ..module_name import *

此外,如果您想从父目录导入任何模块。然后,

from ...module_name.another_module import *

通过这种方式,如果您愿意,您可以导入任何特定的方法。

我们的文件夹结构:

/myproject
  project_using_ptdraft/
    main.py
  ptdraft/
    __init__.py
    nib.py
    simulations/
      __init__.py
      life/
        __init__.py
        life.py

我理解这一点的方式是以包为中心的观点。 包根是ptdraft,因为它是包含__init__.py的最顶层

例如,包中的所有文件都可以使用绝对路径(相对于包根)进行导入 在life.py中,我们简单地有:

import ptdraft.nib

然而,为了包开发/测试目的而运行life.py,而不是python life.py,我们需要使用:

cd /myproject
python -m ptdraft.simulations.life.life

注意,在这一点上,我们根本不需要修改任何路径。


更令人困惑的是,当我们完成ptdraft包时,我们想在一个驱动程序脚本中使用它,它必须在ptdraft包文件夹之外,也就是project_using_ptdraft/main.py,我们需要摆弄路径:

import sys
sys.path.append("/myproject")  # folder that contains ptdraft
import ptdraft
import ptdraft.simulations

使用python main.py运行脚本没有问题。

有用的链接:

https://tenthousandmeters.com/blog/python-behind-the-scenes-11-how-the-python-import-system-works/(查看如何使用__init__.py) https://chrisyeh96.github.io/2017/08/08/definitive-guide-python-imports.html#running-package-initialization-code https://stackoverflow.com/a/50392363/2202107 https://stackoverflow.com/a/27876800/2202107

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

import nib