从父目录相对导入并作为独立文件运行

时间:2015-07-29 16:35:08

标签: python

我在以下树结构中有两个文件

├── __init__.py
├── pkg
│   ├── __init__.py
│   └── child.py
└── top.py

top.py文件看起来像这样

variable = "I live in the top directory"

child.py看起来像这样

from ..top import variable

if __name__ == '__main__':
    print variable

如果我尝试通过python pkg/child.py运行该文件,则会收到错误消息:ValueError: Attempted relative import in non-package。如果从pkg目录以python child.py运行它,我会收到同样的错误。

阅读本回答中提供的答案: How to do relative imports in Python?我尝试从父目录中执行python -m pkg.child。然后我收到错误:ValueError: Attempted relative import beyond toplevel package

所以我开始没有想法了。你应该怎么做?

3 个答案:

答案 0 :(得分:2)

您可以将top包的相对路径附加到child.py中的搜索路径:

import sys
sys.path.append('../')

from top import variable

if __name__ == '__main__':
    print variable

答案 1 :(得分:2)

假设包含top.py的目录名为foo。 然后更改当前的工作目录to the parent of foo,以便该目录将包含在sys.path

cd /path/to/parent/of/foo

然后将child.py作为模块运行:

python -m foo.pkg.child

产量

I live in the top directory
cd /path/to/foo
python -m  pkg.child

不起作用,因为相对导入

from ..top import variable

是指foo,包是child.py之上的两个目录。 foo是 如果您坐在目录 foo并运行python -m pkg.child,则无法识别为包。

答案 2 :(得分:0)

使用os模块怎么样?我在child.py

处的破解
import os

dir_path = os.path.dirname(os.path.abspath(os.curdir))
os.chdir(dir_path)

from top import variable

if __name__ == '__main__':
    print variable