如何将包含模块的目录导入到 Python 路径,该路径是从子文件夹到原始源的符号链接?

How to import a directory with modules to Python path that is a symlink to original source from a subfolder?

我正在尝试 运行 docker 容器 child1 和 child2。 假设我们有:

已更新

|parent
|-----|child1/
             src_folder/
                       __init__.py
                       mod1.py
|-----|child2/
            __init__.py
            symlink_target_folder
            mody.py
            test1_dir/
                      smfile.py

我做过类似的事情

ln -rs ~/parent/child1/src_folder ~/parent/child2/symlink_target_folder

在mody.py我做的时候,

from symlink_target_folder import mod1

有效;

但从 test1_dir>smfile.py 开始

from .child2.symlink_target_folder import mod1

它会返回 ImportError。

我想知道如何从该目录访问同一模块? 可以将 symlink_target_folder 导出到 PYTHONPATH 以某种方式解决。 我做了

导出 PYTHONPATH=$PYTHONPATH:/symlink_target_folder

这样` 我可以从 mody.py

from symlink_target_folder.mod1 import SmFoo

但我认为这不是 PYTHONPATH 造成的。只是 symlink_target_folder 和 mody.py 在同一个文件夹中。

我该如何解决这个问题? 解决这个问题的更好方法是什么? 我做到了 check this out

所以你有以下树结果:

.
├── child1
│   └── srcFolder
│       ├── __init__.py
│       ├── __init__.pyc
│       ├── mod1.py
│       └── mod1.pyc
└── child2
    ├── __init__.py
    ├── mody.py
    ├── symlink_target_folder -> ../child1/srcFolder
    └── test1_dir
        ├── __init__.py
        └── smFile.py

如果您在 smFile.py 中输入以下标题,导入将起作用:

import sys
import os

sys.path.append(os.path.abspath(os.sep.join([".."])))

from symlink_target_folder import mod1

mod1.foo()

除了使用符号 link,您还可以使用该方式添加路径:

sys.path.append(os.path.abspath(os.sep.join(["..", "..", "child1", "srcFolder"])))

这是我解决这个问题的方法;

给定

|parent
|-----|child1/
             src_folder/
                       __init__.py
                       mod1.py
|-----|child2/
            __init__.py
            symlink_target_folder
            mody.py
            test1_dir/
                      smfile.py

我在 child2 文件下创建了 somepth.pth,其中包含:

symlink_target_folder

然后在 child2 下的 simplepth.py 脚本如下:

import site
import os

site.addsitedir(os.path.dirname(__file__))

当你 运行 child2>simplepth.py 它将添加 simplepth 所在的目录和自然指向 /child1/srcFolder 的任何 .pth 文件并将其导入到 sys.path

现在你可以简单地做:

import mod1

这解决了我的问题。

所以如果你只想 运行 test1_dir/smFile.py 您可以只添加 test1_dir 的父目录并将其添加到 site.addsitedir,然后导入 mod1 就可以了。