组织Python包从其顶层目录运行?

组织Python包从其顶层目录运行?,python,Python,如何组织Python包,使其代码从顶级目录运行,而不将该目录添加到主机的Python路径 我还想组织代码,以便可以从各个测试子目录运行测试,同样,无需将包的顶级目录添加到python路径 考虑以下代码布局: foobar/ __init__.py README.txt its_a_module.py one_package/ __init__.py foo.py bar.py tests/ __init__.py test

如何组织Python包,使其代码从顶级目录运行,而不将该目录添加到主机的Python路径

我还想组织代码,以便可以从各个测试子目录运行测试,同样,无需将包的顶级目录添加到python路径

考虑以下代码布局:

foobar/
  __init__.py
  README.txt
  its_a_module.py
  one_package/
    __init__.py
    foo.py
    bar.py
    tests/
      __init__.py
       testing_one_package.py
  tests/
    __init__.py
    test_foobar.py
  • 在foobar/中时,我应该能够在python解释器中导入foobar及其所有子模块
  • 从foobar/,我应该能够运行tests/test\u foobar.py
  • 通过foobar/tests,我应该能够运行test\u foobar.py
  • 从one_包/测试中,我应该能够运行testing_one_package.py
如何组织各个模块的导入语句以及init.py文件的内容,以实现这些目标


(我想使用distutils来管理代码,我了解到从顶级目录运行代码是一个有用的先驱。)

您可以将
添加到
PYTHONPATH
。这将满足您的前两个条件:

  • 在foobar/中时,我应该能够在python解释器中导入foobar及其所有子模块
  • 从foobar/,我应该能够运行tests/test\u foobar.py
您始终可以绝对导入,
import foobar
从foobar.one\u package import…
no
import one\u package
和其他相关导入。通过这种方式,您可以从foobar目录运行任何子模块

其他两项规定,

  • 通过foobar/tests,我应该能够运行test\u foobar.py
  • 从one_包/测试中,我应该能够运行testing_one_package.py

您可以将
PWD
的祖父母和曾祖父母添加到
PYTHONPATH
中,但我从未听说过这一点,而且听起来很糟糕。如果您想让foobar软件包在任何深度都可用,那么您就无法真正绕过安装
foobar
,也就是说,将其放到您的路径上。

目前还不清楚实际问题是什么,以及您迄今为止试图解决的问题。我只是在执行此操作时设置了
PYTHONPATH=$PWD
(例如,
PYTHONPATH=$pwdpython测试/test\u foobar.py
)。这相当简单。不要从包内运行代码,而是从上一级运行。这是有道理的,但表明我无法满足从其测试目录运行测试的标准,至少不能不弄乱paty。是这样吗?这也提出了正确设置导入语句的问题。如果测试一个包导入foobar.its_a_模块,这不起作用。我不确定您的意思是要显式地将“..”添加到路径,还是将其表示的目录字符串。如果是后者,我显式地不想这样做,我希望能够在不影响sys.path的情况下运行代码。
显式地,当前目录的父目录。