如何在python中导入父文件?

2024-05-15 23:20:36 发布

您现在位置:Python中文网/ 问答频道 /正文

您好,我在python(3.9)中有一个aws lambda项目,其结构如下:

*root -|
      *lambda -|
           _init_.py
           A.py
           *features -|
              _init_.py
              alexa.feature
              B.py
              *steps -|
                 _init_.py
                 alexa_steps.py
                 C.py

因此,我有以下建议: 用C.py

from importlib import import_module
A = import_module("lambda.A")


def testC():
    return A.testA()

如果我运行C.py,它可以正常工作,但在alexa_steps.py中 我得到:

from importlib import import_module

@given('the user has opened the skill')
def step_impl(context):
    A = import_module("lambda.A")b
    A.testA()

在终端中,我进入lambda文件夹并执行:behave 测试失败,我得到:

USMCDANCN2Z76AB:mathquiz xzxqdy$ cd lambda
USMCDANCN2Z76AB:lambda xzxqdy$ behave
Exception ModuleNotFoundError: No module named 'lambda'
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.9/bin/behave", line 8, in <module>
    sys.exit(main())
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/behave/__main__.py", line 183, in main
    return run_behave(config)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/behave/__main__.py", line 127, in run_behave
    failed = runner.run()
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/behave/runner.py", line 804, in run
    return self.run_with_paths()
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/behave/runner.py", line 809, in run_with_paths
    self.load_step_definitions()
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/behave/runner.py", line 796, in load_step_definitions
    load_step_modules(step_paths)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/behave/runner_util.py", line 412, in load_step_modules
    exec_file(os.path.join(path, name), step_module_globals)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/behave/runner_util.py", line 386, in exec_file
    exec(code, globals_, locals_)
  File "features/steps/C.py", line 2, in <module>
    A = import_module("lambda.A")
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'lambda'

提前谢谢你的帮助


Tags: lambdainpyimportliblinelibraryload
2条回答

如果必须保留名为lambda的包,它显然与匿名函数的python关键字冲突,因此必须使用^{}并将包名作为字符串传递,以便python不会将其与关键字混淆

我将一个名为“lambda”的包和一个名为“features”的包放在我的“site packages”文件夹中,其结构如下:

site-packages
    lambda
        __init__.py #empty file
        A.py #file contents: def testA(): print("A!")

    features
        __init__.py #empty file
        B.py #file contents: def testB(): print("B!")
        steps
            __init__.py #empty file
            C.py

C.py包含以下内容:

#regular import with module name colliding with a reserved word
from importlib import import_module
A = import_module("lambda.A")
A.testA()

#relative import up a level is covered in https://docs.python.org/3/reference/import.html#package-relative-imports
from ..B import testB
testB()

现在,当我从控制台调用from features.steps import C时,它会输出:

>>> from features.steps import C
A!
B!

这是有关相对导入的最新文档:https://docs.python.org/3/reference/import.html#package-relative-imports

Relative imports use leading dots. A single leading dot indicates a relative import, starting with the current package. Two or more leading dots indicate a relative import to the parent(s) of the current package, one level per dot after the first. For example, given the following package layout:

    package/
        __init__.py
        subpackage1/
            __init__.py
            moduleX.py
            moduleY.py
        subpackage2/
            __init__.py
            moduleZ.py
        moduleA.py

In either subpackage1/moduleX.py or subpackage1/__init__.py, the following are valid relative imports:

    from .moduleY import spam
    from .moduleY import spam as ham
    from . import moduleY
    from ..subpackage1 import moduleY
    from ..subpackage2.moduleZ import eggs
    from ..moduleA import foo

它们最早出现在2.5:https://docs.python.org/2/whatsnew/2.5.html#pep-328-absolute-and-relative-imports

相关问题 更多 >