【问题标题】:Python import module with spaces in directories and directory levels upPython 导入模块,在目录和目录级别上带有空格
【发布时间】:2021-08-03 07:16:15
【问题描述】:

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

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(因为组织必须留在原地)

任何帮助将不胜感激!

【问题讨论】:

标签: python import lib relative-import


【解决方案1】:

您可以使用importlib.import_module

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

# folder with spaces/foo.py
print('Hello World')

【讨论】:

    【解决方案2】:

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

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

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

    文件名用作导入模块的标识符(即 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()
    

    【讨论】:

    • 正如documentation 所说,不鼓励使用此方法以支持使用importlib.import_module()
    • 我认为这仅适用于与 cwd 相关的导入,我认为 __import__ 不适用于我需要的向上目录
    • 我认为它会起作用。但重要的是,从哪里运行你的 python 文件。您是从子文件夹还是从根文件夹运行它?根据这一点,您必须设置导入,为简单起见,root 始终是最佳选择。
    • @schilli 是的,我应该澄清一下,我正在从图表中的“子文件夹1”运行 main。我实际上并不拥有该文件,这意味着我无法移动它。我认为这是我的首要问题。对于这种情况有什么建议或如何使用__import__
    • @mmarion 我明白了。这听起来像一个非常艰难的设置。我通过更改工作目录以从父目录导入的最佳想法更新了我的问题。就像 AdamMcKay 说的那样,python 文档建议使用 importlib 而不是 __import__,但我没有在那个方向调整我的代码,所以最好也遵循这个建议。
    猜你喜欢
    • 1970-01-01
    • 2019-09-06
    • 2015-12-22
    • 2019-06-19
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多