当尝试从一个目录导入文件时,我似乎无法弄清楚如何解决以下错误,这使我发疯。 Python 3.6.7。
The Internet
表示应该完成的操作,其中一个目录向上:
from .. import app
这是错误:
Traceback (most recent call last):
File "module1.py", line 16, in <module>
from .. import app
ValueError: attempted relative import beyond top-level package
这是dir结构(应该注意,我是从module1.py
内部调用脚本package1
的):
--- project/
--- __init__.py
--- app.py
--- package1/
--- __init__.py
--- module1.py
这是我试图解决的问题:
方法1 (相同的错误)
import sys
HERE = Path(__file__).parent
sys.path.append(str(HERE / '../'))
from .. import app
方法2 (found here,相同的错误)
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__)))
from .. import app
方法3 (也是found here,同样的错误)
import sys
sys.path.append('.')
from .. import app
答案 0 :(得分:2)
Python的标准包结构如下:
c:\srv\tmp> tree project
project
|-- project
| |-- __init__.py
| |-- app.py
| `-- package1
| |-- __init__.py
| `-- module1.py
`-- setup.py
其中项目根目录c:\srv\tmp\project
包含一个setup.py
文件和一个包含源代码的子目录(也名为project
)。
module1.py
的内容:
from .. import app
def module1_fn():
print("In module1, have imported app as:", app)
和setup.py
的内容:
from setuptools import setup
setup(
name='project',
packages=['project'], # where to find sources
entry_points={
'console_scripts': """
module1-fn = project.package1.module1:module1_fn
"""
}
)
现在从包含setup.py
的目录运行“魔术”部分(注意末尾的.
):
c:\srv\tmp\project> pip install -e .
Obtaining file:///C:/srv/tmp/project
Installing collected packages: project
Running setup.py develop for project
Successfully installed project
现在,您可以从任何目录运行:
c:\srv\tmp\project> module1-fn
In module1, have imported app as: <module 'project.app' from 'c:\srv\tmp\project\project\app.pyc'>
即。 module1-fn
可以直接从shell(!)调用,而from .. import app
则可以直接(!!)
答案 1 :(得分:1)
我已经在笔记本电脑上工作了,所以希望它也对您有用。
module1.py
import sys
from os import path
sys.path.append(path.join(path.dirname(__file__), '..'))
from app import print_app
print_app()
app.py:
def print_app():
print('success')
return None
结果:
$python module1.py
'success'