【问题标题】:How to import a directory with modules to Python path that is a symlink to original source from a subfolder?如何将带有模块的目录导入 Python 路径,该路径是子文件夹中原始源的符号链接?
【发布时间】:2015-04-03 13:24:16
【问题描述】:

我正在尝试运行 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

【问题讨论】:

  • 要确定您要问什么:问题是当您尝试使用命令@987654330 在目录smfile.py 中执行smfile.py 时,脚本会抛出ImportError @对吗?
  • 喜欢cd child2/test1_dir/ && python smfile.py 对吗?
  • @FunkySayu 如果我已将特定目录导出到 pythonpath,比如 X 文件夹,我可以从子文件夹中执行“从 X 导入 *”吗?在这种情况下,这将是 test1_dir,因为它似乎不起作用;
  • @FunkySayu 如果我已将特定目录导出到 pythonpath,比如 X 文件夹,我可以从子文件夹中执行“从 X 导入 *”吗?在这种情况下,这将是 test1_dir,因为它似乎不起作用;
  • 答案已更新。经过测试,它可以工作。

标签: python python-2.7 docker fig


【解决方案1】:

所以你有以下树结果:

.
├── 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()

除了使用符号链接,您还可以使用这种方式添加路径:

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

【讨论】:

  • 符号链接是必需的。我想知道是否有办法使用符号链接来做到这一点?
  • 你试过from symlink_target_folder.md1 import SmFoo吗?
  • 这就是我卡住的地方。我想知道为什么它会抛出 ImportError: No module named symlink_target_folder.md1;我正在运行一个 bash 脚本,该脚本首先将此符号链接路径导出到 PYTHONPATH。尽管如此,它还是会引发错误。不确定它是否正确导出。
  • 我不明白你的问题:我试过cd child2 && ln -s ../child1 child1,它工作正常。
  • 我真的不建议使用环境变量来解决您的问题。你可以用 Python 做的一切,都用 Python 做。此外,使用符号链接并不是您能做的最好的事情。顺便说一句,如果您想自动生成sys.path 技巧(如您所说,一种更通用的方式),请查看buildout for Python。比如 Plone 就是一个基于此的大项目,有多个模块,它会自动生成启动脚本。
【解决方案2】:

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

给定

|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 ,它会工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2012-04-01
    • 2019-11-12
    • 2014-04-08
    • 2015-07-18
    • 1970-01-01
    相关资源
    最近更新 更多