Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在模块和主模块中使用相对导入_Python_Python 2.7_Import - Fatal编程技术网

Python 如何在模块和主模块中使用相对导入

Python 如何在模块和主模块中使用相对导入,python,python-2.7,import,Python,Python 2.7,Import,我在python中设置了以下库: library | - __init__.py | - lib1.py | - ... | - tools | - __init__.py | - testlib1.py 因此换句话说,目录库包含python模块,目录工具,它是库的子目录,包含例如一个文件testlib1.py来测试库lib1.py testlib1.py因此需要从上面的目录导入lib1.py来执行一些测试等,只要从计算机上的某个地方调用pyth

我在python中设置了以下库:

library
  | - __init__.py
  | - lib1.py
  | - ...
  | - tools
        | - __init__.py
        | - testlib1.py
因此换句话说,目录
包含python模块,目录
工具
,它是
的子目录,包含例如一个文件
testlib1.py
来测试库
lib1.py

testlib1.py
因此需要从上面的目录导入
lib1.py
来执行一些测试等,只要从计算机上的某个地方调用
python testlib1.py
,假设文件位于搜索路径中。 此外,我只希望指定一个
PYTHONPATH

但是我们都知道以下关于
testlib1.py
的想法不起作用,因为相对导入不起作用:

from .. import lib1
...
do something with lib1
我接受两种答案:

  • 这个答案描述了如何仍然可以直接调用
    testlib1.py
    作为正在执行的python脚本
  • 答案解释了更好的模块等概念设置,前提是所有内容都必须位于目录
    项目
    中,并且工具必须位于与实际库不同的目录中
    
    如果有什么不清楚的地方,我建议提问,我会更新问题

    尝试向
    工具
    目录添加一个
    \uuuu init\uuuu.py
    。相对导入应该可以工作。

    您不能。如果计划使用相对导入,则无法单独运行模块。 要么放弃相对导入,要么放弃直接运行
    testlib1.py
    的想法

    我还认为测试文件不应该使用相对导入。测试应该检查库是否工作,因此代码应该尽可能与用户实际使用的代码相似。通常用户不会将文件添加到库中以使用相对导入,而是使用绝对导入

    顺便说一句,我认为您的文件组织过于“java化”:混合了源代码和测试。如果您想进行测试,那么为什么不进行以下测试:

    project/
       |
       +-- src/
       |    |
       |    +--library/
       |    |     |
       |    |     +- lib1.py
       |    |     |
       |    |    #...
       |    +--library2/ #etc.
       |
       +-- tests/
            |
            +--testlibrary/
            |      |
            |      +- testlib1.py
            #etc
    

    要运行测试,只需使用像NoTests这样的工具,它会自动查找这种文件夹结构,并提供大量选项来更改搜索/测试设置。

    实际上,我找到了一个解决方案,它可以

  • 使用当前的实现
  • 不需要对PYTHONPATH进行任何更改
  • 无需硬编码顶级lebel目录
  • testlib1.py
    中,以下代码可以(已测试):


    不完全确定这是一个非常干净或简单的解决方案,但它允许从目录中导入一级以上的任何模块,这正是我所需要的(因为测试代码或额外代码,或者无论何时都位于实际模块文件的下一级)。

    不是。我把问题缩减了。哦,您还必须将testlib1作为一个包运行——比如:python-m library.tools.testlib1这也不是一个解决方案:我需要
    testlib1.py
    从系统中的任何位置运行,而不必进入此目录。当我尝试按照您的建议执行此操作时,我得到一个错误
    /usr/bin/python:没有名为testrunner的模块
    。另请参见关于PYTHONPATH的更新问题您的
    PYTHONPATH
    是否包含
    library/
    的父目录?@tom:是的,例如,要在其他一些不相关的文件中导入
    lib1.py
    ,我会从库导入lib1
    。如果
    library/
    在您的
    PYTHONPATH
    中,然后您应该完全从您的测试模块导入
    lib
    。i、 e.
    从库导入lib1
    import os
    import sys
    dirparts = os.path.dirname(os.path.abspath(__file__)).split('/')
    sys.path.append('/'.join(dirparts[:-1]))
    
    import  mylib1