首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Import with导入具有相对导入的导入模块

使用Import with导入具有相对导入的导入模块
EN

Stack Overflow用户
提问于 2021-04-22 06:45:59
回答 1查看 134关注 0票数 1

我正在编写一个python脚本来从另一个项目导入一个设置文件。

这是该项目的结构:

代码语言:javascript
复制
- root
- ...
- folder_1
    - setting_folder
        - __init__.py
        - setting_1.py
        - setting_2.py
        - setting_3.py

在这里,文件内容:

init.py

代码语言:javascript
复制
from .setting_1 import *
from .setting_2 import *

setting_1.py

代码语言:javascript
复制
foo = "foo1"

setting_2.py

代码语言:javascript
复制
foo = "foo2"

try:
    from .setting_3 import *
except ImportError:
    pass

setting_3.py

代码语言:javascript
复制
foo = "foo3"

我需要做的是,从项目外部的脚本中加载setting_2.py并获得foo变量的值(由于相对导入而产生的foo3)。

假设我在目录"C:\Users\bar\Desktop“中运行我的脚本。实现此目标的想法是将setting_2.py复制到项目之外的另一个目录(例如a),在a中创建一个空文件init.py,附加到PYTHONPATH "C:\Users\bar\Desktop“,然后导入该模块。

在这里,代码:

代码语言:javascript
复制
import os
import importlib.util

with open(setting_2_path, "r") as f:
   test_file_content = f.read()

setting_tmp_path = r"C:\Users\bar\Desktop\a\setting_2.py"
with open(setting_tmp_path, "w") as f:
    f.write(test_file_content)

init_tmp_path = r"C:\Users\bar\Desktop\a\__init__.py"

with open(init_tmp_path, "w") as f:
    f.write("")

current_env = os.environ.copy()
current_env.update({'PYTHONPATH': r"C:\Users\bar\Desktop"})

spec_module = importlib.import_module('a.setting_2')

print(getattr(spec_module, "foo"))

这是很好的工作,但在生产中,这个脚本将在另一个项目,我不能创建一个文件夹在同一级别的脚本。

我可以创建文件夹,但在另一个目录。

为了模拟这个场景,假设我从C:\Users\bar\Desktop\bar 2运行脚本,文件夹是C:\Users\bar\Desktop\a。

在本例中,我有以下错误:

代码语言:javascript
复制
ImportError: No module named 'a'

我怎样才能解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2021-04-22 08:09:03

代码语言:javascript
复制
import os
import sys

cwd = os.getcwd()  # This is current working directory, as in your assumption it is: C:\Users\bar\Desktop\bar2

path_to_settings_files = os.path.join(os.path.dirname(cwd), 'a')  # This is where settings are, as in your assumption it is: C:\Users\bar\Desktop\a

sys.path.append(path_to_settings_files)  # This line guides interpreter to find settings.py in loading modules

import setting_1
import setting_2
import setting_3

print(setting_1.foo)
print(setting_2.foo)
print(setting_3.foo)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67208073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档