代码之家  ›  专栏  ›  技术社区  ›  user129975

如何导入上述目录中的Python类?

  •  300
  • user129975  · 技术社区  · 17 年前

    11 回复  |  直到 13 年前
        1
  •  143
  •   gimel    12 年前

    from ..subpkg2 import mod

    根据Python文档:在包层次结构中,使用两个点作为 import statement

    from 您可以指定遍历当前包层次结构的高度,而无需指定确切的名称。一个前导点表示进行导入的模块所在的当前包。 from . import mod pkg pkg.mod 从内部 pkg.subpkg1 pkg.subpkg2.mod .有关进口的规格载于 PEP 328 .

        2
  •  81
  •   Sepero    12 年前
    import sys
    sys.path.append("..") # Adds higher directory to python modules path.
    
        3
  •  68
  •   Jacob Marble Ray Donnelly    14 年前

    __file__ os.path.dirname 打电话就行了;-),然后(如果该目录尚未打开 sys.path )prepend在开头临时插入所述目录 搜索路径 , __import__ 必须

    import sys
    import os.path
    sys.path.append(
        os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)))
    
    import module_in_parent_dir
    
        4
  •  33
  •   Praveen    8 年前

    from .. import module
    
        5
  •  -6
  •   ThorSummoner    8 年前

    前言:我对之前的答案进行了实质性的重写,希望帮助人们更好地融入python的生态系统,并希望通过python的导入系统给每个人带来最大的成功。

    包装内的相对进口 ,我认为这是OP问题最有可能的情况。

    Python是一个模块化系统

    这就是为什么我们写 import foo 从根命名空间加载模块“foo”,而不是编写:

    foo = dict();  # please avoid doing this
    with open(os.path.join(os.path.dirname(__file__), '../foo.py') as foo_fh:  # please avoid doing this
        exec(compile(foo_fh.read(), 'foo.py', 'exec'), foo)  # please avoid doing this
    

    这就是为什么我们可以在没有事实文件系统的环境中嵌入python,而不提供虚拟文件系统,如Jython。

    package relative imports like .foo and ..foo

    如果你真诚地想将源代码加载模式耦合到文件系统,你可以这样做。我建议你必须选择自己的启发式方法,并使用某种进口机器 importlib

    import importlib.util
    import sys
    
    # For illustrative purposes.
    file_path = os.path.join(os.path.dirname(__file__), '../foo.py')
    module_name = 'foo'
    
    foo_spec = importlib.util.spec_from_file_location(module_name, file_path)
    # foo_spec is a ModuleSpec specifying a SourceFileLoader
    foo_module = importlib.util.module_from_spec(foo_spec)
    sys.modules[module_name] = foo_module
    foo_spec.loader.exec_module(foo_module)
    
    foo = sys.modules[module_name]
    # foo is the sys.modules['foo'] singleton
    

    包装

    https://github.com/pypa/sampleproject

    适用于其他计算机(无论解释器、主机操作系统等)

    目录结构

    foo ,在某个目录中(最好是空目录)。

    some_directory/
        foo.py  # `if __name__ == "__main__":`  lives here
    

    setup.py 作为兄弟姐妹 foo.py 在“src/”目录下有点流行,这里没有介绍。

    some_directory/
        foo.py
        setup.py
    

    .

    #!/usr/bin/env python3
    # setup.py
    
    import setuptools
    
    setuptools.setup(
        name="foo",
        ...
        py_modules=['foo'],
    )
    

    .

    python3 -m pip install --editable ./  # or path/to/some_directory/
    

    -e

    foo __init__.py )代替模块(单个“.py”文件),“包”和“模块”都可以加载到根命名空间中,模块允许嵌套命名空间,如果我们想有一个“相对一个目录向上”的导入,这很有帮助。

    some_directory/
        foo/
            __init__.py
        setup.py
    

    .

    #!/usr/bin/env python3
    # setup.py
    
    import setuptools
    
    setuptools.setup(
        name="foo",
        ...
        packages=['foo'],
    )
    

    foo/__main__.py ,这允许python将包作为模块执行,例如 python3 -m foo __main__ .

    some_directory/
        foo/
            __init__.py
            __main__.py  # `if __name__ == "__main__":`  lives here, `def main():` too!
        setup.py
    

    .

    #!/usr/bin/env python3
    # setup.py
    
    import setuptools
    
    setuptools.setup(
        name="foo",
        ...
        packages=['foo'],
        ...
        entry_points={
            'console_scripts': [
                # "foo" will be added to the installing-environment's text mode shell, eg `bash -c foo`
                'foo=foo.__main__:main',
            ]
        },
    )
    

    some_directory/
        bar.py           # `import bar`
        foo/
            __init__.py  # `import foo`
            __main__.py
            baz.py       # `import foo.baz
            spam/           
                __init__.py  # `import foo.spam`
                eggs.py      # `import foo.spam.eggs`
        setup.py
    

    setup.py

    • foo
    • 单页文档内容(如README),
    • python ./setup.py test

    PYPA Sample Repository's setup.py

    pip install s --target 选项,或virtualenv,又名venv,用于潜在客户。

    回到例子

    从foo/spam/eggs.py中,如果我们想要foo/baz中的代码,我们可以通过它的绝对命名空间来请求它:

    import foo.baz
    

    如果我们想保留将来将eggs.py移动到其他相对目录的能力 baz 实现时,我们可以使用相对导入,如:

    import ..baz
    
    推荐文章