【问题标题】:import class problem [duplicate]导入类问题[重复]
【发布时间】:2011-01-26 16:44:29
【问题描述】:

可能重复:
Basic Python imports question

我有这个结构的项目:

project_folder:
    __init__.py
    classes_folder:
        __init__.py
        class1.py
        class2.py
    tests_folder:
        __init__.py
        test1.py

现在我需要在test1.py 中导入class1.py。我该怎么做?

【问题讨论】:

    标签: python


    【解决方案1】:

    假设PYTHONPATH=. 并且您位于project folder 然后...

    import classes_folder.class1

    “定位”是指您从project folder 运行python。

    这一切都与您的PYTHONPATH 有关。考虑到这一点。

    因此,如果您位于project folder/tests_folder,为了避免问题,请将PYTHONPATH 设置为项目的根目录:

    export PYTHONPATH=/full/path/to/project_folder

    然后,当您从不同的文件夹启动测试时,您将不会有任何问题。

    编辑以回答有关在运行时更改 python 路径的评论

    import sys
    sys.path.append("/full/path/to/project_folder")
    

    或者更好的是,你可以根据你从哪里执行 python 来做到这一点......

    import sys,os
    home_project=os.path.abspath(".")
    sys.path.append(home_project)
    

    【讨论】:

    • 如何直接从脚本中将project_folder 添加到pythonpath?我需要简单地将project_folder 复制到另一台计算机并运行test 脚本而无需任何预配置
    • @cru3l 查看我的答案版本。我已经包含了您可能需要的内容。
    • 这行得通,但我应该在每个测试脚本的顶部写这个sys.path.append 吗?有没有办法干燥这个?谢谢。
    • 您只需在“主要”方法上执行一次。如果你有一个通过所有测试的脚本,你只需要在那里做。
    【解决方案2】:
    from ..classes_folder import class1
    

    例子:

    $ ls -R root
    root:
    foobar/  tests/  __init__.py
    
    root/foobar:
    __init__.py  mod.py
    
    root/tests:
    __init__.py  test1.py
    
    $ cat root/foobar/mod.py; echo '###'; cat root/tests/test1.py
    print "running", __name__
    ###
    from ..foobar import mod
    
    $ python -m root.tests.test1
    running root.foobar.mod
    

    【讨论】:

    • 这给了我ValueError: 'Attempted relative import in non-package'
    • @cru3l: test1 是如何被执行或导入的?您没有将 test1.py 作为 project_folder.tests_folder.test1 运行,这正是这种导入方式检测到的错误类型。
    • ?> pwd -> /Users/cru3l/project_folder/tests_folder/ , ?> python test1.py -> from ..classes_folder import class1 ValueError: Attempted relative import in non-package
    • @cru3l:是的,这是错误的做法。看看我是如何使用 python -m 的;您要么需要位于 'project_folder'/'root' 上方的目录中(通常会再嵌套一层,例如 /Users/cru3l/project_name/name_of_top_package,其中 name_of_top_package 可能与 project_name 相同),或者' project_folder'/'root' 必须正确位于 sys.path 中(这可能会以几种不同的方式发生)。
    • 这对我来说似乎是一种可怕的方式,因为我想使用独立的脚本文件,这迫使我将文件作为大项目的一部分运行。
    【解决方案3】:

    您可以将以下代码添加到classes_folder/__init__.py

    __all__ = ['class1', 'class2']
    

    然后在你的测试中(test_folder/test1.py):

    from classes_folder import *
    

    这样test1.py 将覆盖classes_folder 内的所有班级

    【讨论】:

    • 给出错误ImportError: 'No module named classes_folder'
    • 好的。设置 PYTHONPATH=/full/path/to/project_folder
    猜你喜欢
    • 2019-03-29
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 2019-11-21
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    相关资源
    最近更新 更多