1

我正在更详细地“重新发布”这个问题,因为我觉得它第一次被误解了。我有一个看起来像这样的文件夹结构:

folder w space
       ├── folder1
       │      └── subfolder1
       │              └── file_1.py
       └── folder2
              └── folder w space2
                       └── file_2.py
                       └── __init__.py

我需要 file_1.pyfile_2.py. 请注意file_2.py,相对于file_1.py,是向上 3 个目录,然后向下是 3 个目录。理论上,我会这样写相对导入:

from ...folder2 import folder w space2.file2

但是,由于子文件夹中的间距,这是无效的。绝对导入更糟糕,因为基本文件夹也包含空格:

from folder w space.folder2.folder w space2.file2 

有了这个,我怎样才能访问file_2.py没有的内容:

  1. 重命名文件夹(我不拥有它们,所以即使我想也不能)
  2. 不使用sys.path.append()(在我们的生产环境中效果不佳)
  3. 搬家file_2.py(因为组织必须留在原地)

任何帮助将不胜感激!

4

2 回答 2

0

您可以使用importlib.import_module

# bar.py
import importlib
importlib.import_module("folder with spaces.foo")     

# folder with spaces/foo.py
print('Hello World')
于 2021-05-12T22:54:01.230 回答
0

内置__import__()允许在 import 语句中支持空格:

sample_with_spaces = __import__("sample with spaces.foo")

sample_with_spaces.foo.hello()

在这个问题中找到它: https ://stackoverflow.com/a/9123555/6180150

filename 用作导入模块的标识符(即 foo.py 将作为 foo 导入)并且 Python 标识符不能有空格,import 语句不支持

因此,不是让 import 语句设置标识符,而是通过分配__import__("sample with spaces.foo")给您自己选择的标识符来手动完成。在我的示例中,它是标识符sample_with_spaces

编辑:

我认为在您的情况下,在子文件夹中执行脚本时,这是更新工作目录的最简单方法,如下所示。

import os

os.chdir("..") # move up as much as needed
sample_with_spaces = __import__("sample with spaces.foo")

sample_with_spaces.foo.hello()
于 2021-05-12T23:02:16.713 回答