为什么Python尝试从非工作目录导入本地模块?

为什么Python尝试从非工作目录导入本地模块?,python,module,Python,Module,我的文件夹结构如下: LIST_FEATURES = ['feat_1','feat_2','feat_3'] LIST_OTHER_FEATURES = ['feat_4','feat_5','feat_6'] script.py 文件夹1 script.py 剧本 features.py \uuuu init\uuuuu.py 文件夹2 script.py 剧本 features.py \uuuu init\uuuuu.py 在顶层script.py文件中,我有以下代

我的文件夹结构如下:

LIST_FEATURES = ['feat_1','feat_2','feat_3']
LIST_OTHER_FEATURES = ['feat_4','feat_5','feat_6']
  • script.py
  • 文件夹1
    • script.py
    • 剧本
      • features.py
      • \uuuu init\uuuuu.py
  • 文件夹2
    • script.py
    • 剧本
      • features.py
      • \uuuu init\uuuuu.py
在顶层script.py文件中,我有以下代码,允许我连续运行每个脚本:

import os

list_filepath = ['folder_1','folder_2']

for filepath in list_filepath:
    # change wd
    os.chdir(filepath)
    # run script.py
    exec(open('script.py').read())
在文件夹_1中的script.py文件中,我有以下代码:

import os

os.chdir('folder_1')

import scripts.features as feat
import os

os.chdir('folder_2')

import scripts.features as feat
文件夹_1/scripts中的features.py脚本可能包含以下内容:

LIST_FEATURES = ['feat_1','feat_2','feat_3']
LIST_OTHER_FEATURES = ['feat_4','feat_5','feat_6']
运行此脚本不会遇到任何问题

在文件夹_2中的script.py文件中,我有以下代码:

import os

os.chdir('folder_1')

import scripts.features as feat
import os

os.chdir('folder_2')

import scripts.features as feat
文件夹_2/scripts
中的
features.py
文件可能包含以下内容:

LIST_FEATURES = ['feat_1','feat_2','feat_3']
LIST_OTHER_FEATURES = ['feat_4','feat_5','feat_6']
但是,当我尝试在该模块中使用功能时,我得到:

AttributeError: module 'scripts.features' has no attribute 'LIST_OTHER_FEATURES'
当我独自运行
feat
(在Spyder中)时,它会告诉我:

In[2]: feat
Out[2]: <module 'scripts.features' from 'folder_1\\scripts\\features.py'>
[2]中的
:专长
出[2]:
因此,当我希望它使用文件夹_2中的features.py模块时,它似乎试图使用文件夹_1中的features.py模块


如何让它执行此操作?

当您导入模块/包时,python会在
sys.modules
中查找它,请参阅

你可以:

  • 通过从文件位置('foo','foo.py')导入lib.util.spec从文件创建
    spec
  • 创建
    模块
    by
    importlib.util.module\u from\u spec(spec)
  • spec.loader.exec\u模块(模块)

为避免命名冲突。

当您导入模块/包时,python会在
sys.modules
中查找它,请参阅

你可以:

  • 通过从文件位置('foo','foo.py')导入lib.util.spec从文件创建
    spec
  • 创建
    模块
    by
    importlib.util.module\u from\u spec(spec)
  • spec.loader.exec\u模块(模块)

为了避免命名冲突。

您正在对
import
进行黑客攻击,因此当您
chdir
folder1
并导入
脚本时,它会将其作为
脚本
导入,而不是
folder1.scripts
。因此,当您转到
folder2
并尝试
导入脚本
时,看起来您正在导入相同的内容。所以这个模块在技术上是缓存的,它只是使用
folder1.scripts
,这就是
scripts
。对于口译员,您正在执行以下操作:

import scripts.features
导入脚本和功能
举例说明:

导入操作系统
os.chdir('folder_1/features')
将要素作为f1导入
主任(f1)
[“F1功能”、“内置”、“缓存”、“文档”、“文件”、“加载程序”、“名称”、“包”、“规范”]
os.chdir(“../../folder_2/features”)
将要素导入为f2
目录(f2)
#注意,f2已被视为使用名称f1进行缓存
[“F1功能”、“内置”、“缓存”、“文档”、“文件”、“加载程序”、“名称”、“包”、“规范”]
该模块已被缓存。因此,您需要做的是重新组织文件夹结构:

  • 主文件夹/

    • script.py

    • 文件夹1/

      • __初始值

      • 特征/

        • __初始值
        • features.py
    • 文件夹2/

      • __初始值

      • 特征/

        • __初始值
        • features.py
这应该允许您使用导入,而不是直接执行读入文件(无论如何您都不应该这样做)

script.py中的
#
从文件夹_1.features将要素作为f1导入
从文件夹_2.features将要素导入为f2
#检查一下里面装的东西
主任(f1)
[“F1功能”、“内置”、“缓存”、“文档”、“文件”、“加载程序”、“名称”、“包”、“规范”]
目录(f2)
['F2功能','UUUUU内置','UUUU缓存','UUUU文档','UUUUU文件','UUUU加载程序','UUUU名称','UUUUUUU包','UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
编辑:
文件夹\u N/script.py
看起来像什么? 如果您需要一些包脚本来导入功能,它将如下所示:

LIST_FEATURES = ['feat_1','feat_2','feat_3']
LIST_OTHER_FEATURES = ['feat_4','feat_5','feat_6']
#文件夹_N/script.py
从功能导入功能
你可以这样称呼它

从文件夹_1导入脚本作为s1
从文件夹_2将脚本作为s2导入
s1.features.F1_特征
“你好”
s2.features.F2_特征
“世界”

但是,这要求只能通过
从文件夹导入脚本导入
文件夹/script.py
。我建议大家阅读一下导入的工作原理,了解更多细节。

您正在修改
import
,因此当您
chdir
folder1
,并导入
脚本时,它会将其作为
脚本导入,而不是
folder1.scripts
。因此,当您转到
folder2
并尝试
导入脚本
时,看起来您正在导入相同的内容。所以这个模块在技术上是缓存的,它只是使用
folder1.scripts
,这就是
scripts
。对于口译员,您正在执行以下操作:

import scripts.features
导入脚本和功能
举例说明:

导入操作系统
os.chdir('folder_1/features')
将要素作为f1导入
主任(f1)
[“F1功能”、“内置”、“缓存”、“文档”、“文件”、“加载程序”、“名称”、“包”、“规范”]
os.chdir(“../../folder_2/features”)
将要素导入为f2
目录(f2)
#注意,f2已被视为使用名称f1进行缓存
[“F1功能”、“内置”、“缓存”、“文档”、“文件”、“加载程序”、“名称”、“包”、“规范”]
该模块已被缓存。因此,您需要做的是重新组织文件夹结构: