我想从同一目录中的另一个文件导入一个函数.
有时它适用于我,from .mymodule import myfunction
但有时我会得到:
SystemError: Parent module '' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)
有时它适用from mymodule import myfunction
,但有时我也得到:
SystemError: Parent module '' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)
我不明白这里的逻辑,我找不到任何解释.这看起来完全随机.
有人可以向我解释这一切背后的逻辑是什么吗?
我正在运行Python 2.5.
这是我的文件夹树:
ptdraft/
nib.py
simulations/
life/
life.py
Run Code Online (Sandbox Code Playgroud)
(我也在__init__.py
每个文件夹中,为了便于阅读,这里省略了)
如何nib
从模块内导入life
模块?我希望有可能不用修补sys.path.
注意:正在运行的主模块位于该ptdraft
文件夹中.
看来这里已经有一些关于python 3中相对导入的问题了,但是在经历了很多这些问题后,我仍然找不到我的问题的答案.所以这是问题所在.
我有一个如下所示的包裹
package/
__init__.py
A/
__init__.py
foo.py
test_A/
__init__.py
test.py
Run Code Online (Sandbox Code Playgroud)
我在test.py中有一行:
from ..A import foo
Run Code Online (Sandbox Code Playgroud)
现在,我在文件夹中package
,我跑了
python -m test_A.test
Run Code Online (Sandbox Code Playgroud)
我收到了消息
"ValueError: attempted relative import beyond top-level package"
Run Code Online (Sandbox Code Playgroud)
但如果我在父文件夹中package
,例如,我运行:
cd ..
python -m package.test_A.test
Run Code Online (Sandbox Code Playgroud)
一切都好.
现在我的问题是:
当我在文件夹中时package
,我在test_A子包中运行模块test_A.test
,根据我的理解,..A
只上升一个级别,它仍然在package
文件夹中,为什么它给出了消息说beyond top-level package
.导致此错误消息的原因是什么?
这是一个经常以不同形式提出的问题,并经常得到"大声笑你没有做好"的回答.很确定这是因为人们(包括我)有一个常识场景试图用作实现,解决方案并不明显(如果你之前没有这样做过).
会接受一个"让飞出瓶子"的答案.
特定
project/
__init__.py
/code
__init__.py
sut.py
/tests
__init__.py
test_sut.py
Run Code Online (Sandbox Code Playgroud)
tests_sut.py开始的位置:
import code.sut
Run Code Online (Sandbox Code Playgroud)
在根目录中运行nosetests会导致:
ImportError: No module named code.sut
Run Code Online (Sandbox Code Playgroud)
旅行途径:
a)做亲戚使用
from ..code import sut
Run Code Online (Sandbox Code Playgroud)
b)将项目的根添加到PYTHONPATH
c)使用
sys.path.append
Run Code Online (Sandbox Code Playgroud)
在每个测试模块的开头导入之前添加..路径.
d)只记得做一个
setup.py
Run Code Online (Sandbox Code Playgroud)
在项目上,在运行测试之前将模块安装到站点包中.
因此,要求是在测试包根目录下面有可以访问项目的测试.上面的每一个对我来说都不觉得"自然",已经证明有问题或者看起来太辛苦了!
在java中这是有效的,但基本上是通过构建工具/ IDE将所有类放在类路径上.也许问题是我期待Python的"魔力"?在Flask webframework测试中已经注意到,选项d)似乎是首选.
在任何情况下,下面的陈述推荐一个首选的解决方案将消除我自己的"不自然"的感觉.
标准库清楚地记录了如何直接导入源文件(给定源文件的绝对文件路径),但如果源文件使用隐式同级导入,则此方法不起作用,如下例所示.
如果这个例子适用于隐式兄弟导入的存在?
我已经签出这个和这个其他的话题#1的问题,但他们并没有解决隐同级进口内用手导入的文件.
这是一个说明性的例子
目录结构:
root/
- directory/
- app.py
- folder/
- implicit_sibling_import.py
- lib.py
Run Code Online (Sandbox Code Playgroud)
app.py
:
import os
import importlib.util
# construct absolute paths
root = os.path.abspath(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
isi_path = os.path.join(root, 'folder', 'implicit_sibling_import.py')
def path_import(absolute_path):
'''implementation taken from https://docs.python.org/3/library/importlib.html#importing-a-source-file-directly'''
spec = importlib.util.spec_from_file_location(absolute_path, absolute_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
return module
isi = path_import(isi_path)
print(isi.hello_wrapper())
Run Code Online (Sandbox Code Playgroud)
lib.py
:
def hello():
return 'world'
Run Code Online (Sandbox Code Playgroud)
implicit_sibling_import.py
:
import lib # this is the …
Run Code Online (Sandbox Code Playgroud) 我已经尝试了几天来解决项目中的相对导入错误,但没有成功。我有以下项目树:
proj
|
|---__init__.py
|
|---lib
| |---__init__.py
| |---func.py
|
|---src
| |---main.py
Run Code Online (Sandbox Code Playgroud)
这__init__.py
是一个空文件。
包含func.py
打印功能:
def hello_func():
print("Hello !!!")
Run Code Online (Sandbox Code Playgroud)
这main.py
:
from ..lib import *
hello_func()
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我收到此错误:
ImportError: attempted relative import with no known parent package
Run Code Online (Sandbox Code Playgroud)
有人遇到同样的问题吗?
我有以下文件结构:
bot
??? LICENSE.md
??? README.md
??? bot.py # <-- file that is executed from command line
??? plugins
? ??? __init__.py
? ??? debug.py
? ??? parsemessages.py
??? helpers
? ??? __init__.py
? ??? parse.py
? ??? greetings.py
??? commands
??? __init__.py
??? search.py
Run Code Online (Sandbox Code Playgroud)
bot.py
当从命令行执行时,将加载plugins
目录中的所有内容。
我想从目录plugins/parsemessages.py
导入,所以我这样做:parse
helpers
# parsemessages.py
from ..helpers import parse
parse.execute("string to be parsed")
Run Code Online (Sandbox Code Playgroud)
我python3 bot.py
从命令行运行。
我收到以下错误:
File "/home/bot/plugins/parsemessages.py", line 2, in <module>
from ..helpers import parse
ValueError: …
Run Code Online (Sandbox Code Playgroud) 由于导入问题,我已按照此处显示的步骤将我的 Python 项目安装为可编辑pip
包。基本上这需要pip install -e .
从我的项目根目录运行。项目名称为“myproject”,setup.py
配置如下:
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())
Run Code Online (Sandbox Code Playgroud)
项目结构是这样的:
.
??? myproject
? ??? core
? ? ??? core.py
? ? ??? __init__.py
? ??? tests
? ??? __init__.py
? ??? test_one.py
??? setup.py
??? env
??? ...
Run Code Online (Sandbox Code Playgroud)
随着venv
启动,我得到下面的输出:
(env) [root@localhost /]$ python -V
Python 3.6.3
(env) [root@localhost /]$ pip -V
pip 9.0.1 from /myproject/venv/lib64/python3.6/site-packages (python 3.6)
Run Code Online (Sandbox Code Playgroud)
但是,在运行解释会话时,我会遇到以下情况:
(env) [root@localhost /]$ python
>>> import …
Run Code Online (Sandbox Code Playgroud) 有人能告诉我在 pytest 中处理资源文件的正确方法是什么吗?
我习惯在包(src)目录下创建一个资源目录,并在测试分支下创建另一个目录
root---package---resource_dir
| |-file1.py
| |-file2.py
|
|-test-- resource_dir-
| |-config1.csv
| |-config2.csv
|-test1.py
|-test2.py
Run Code Online (Sandbox Code Playgroud)
如果我想从测试中访问这些文件,Pythonic 的方式是什么?到目前为止,我一直在使用相对文件路径,但该解决方案并不是很好。有没有类似于Java资源解决方案的解决方案?
我正在尝试从 Python 中的同级包中导入一个模块;按照此答案中的说明进行操作。我的问题是导入有效......但mypy
说这是一个错误的导入。我试图了解为什么 mypy 报告错误,以及如何修复它。
这是我已成功安装的模块python -m pip install -e .
。我知道它已安装,因为它在我运行时列出pip freeze
,并且在sys.path
我打印出来时列出了项目根目录。
mypackage
??? mypackage
? ??? foo
? ? ??? __init__.py
? ? ??? db.py
? ??? bar
? ? ??? __init__.py
? ? ??? model.py
? ??? py.typed
??? setup.py
Run Code Online (Sandbox Code Playgroud)
在 db.py 中:
from mypackage.bar import model
Run Code Online (Sandbox Code Playgroud)
在model.py中:
class MyClass:
# implementation irrelevant
Run Code Online (Sandbox Code Playgroud)
当我运行 mypy(mypy mypackage
从项目基目录)时,出现以下错误:
mypackage/foo/db.py:7: error: Module 'mypackage.bar' has no attribute 'model' …
Run Code Online (Sandbox Code Playgroud) 我正在尝试从同级文件夹中的 python 文件导入模块。我在这里阅读了几个类似的问题并尝试应用那里列出的解决方案,但我无法解决问题。
结构如下:
parentfolder/gfolder/codefolder/fileA.py
parentfolder/gfolder/utilfolder/util.py
Run Code Online (Sandbox Code Playgroud)
gfolder
,codefolder
并且utilfolder
都有一个__init__.py
.
我正在尝试在 fileA.py 中执行以下操作:
import gfolder.utilfolder.util as util
Run Code Online (Sandbox Code Playgroud)
我还尝试在导入语句之前添加:
sys.path.append(".../parentfolder/")
Run Code Online (Sandbox Code Playgroud)
这也不起作用:
import gfolder.utilfolder.util as util
ModuleNotFoundError: No module named 'gfolder'
Run Code Online (Sandbox Code Playgroud)
类似问题中的解决方案说要包含__init.py__
在我已经拥有的目录中。
编辑:现在无论是sys.append
和sys.insert
工作,问题是,我包括在路径的结尾斜线。当我把它拿出来时,一切正常。
python ×10
python-3.x ×6
package ×3
import ×2
directory ×1
importerror ×1
module ×1
mypy ×1
nose ×1
path ×1
pip ×1
pytest ×1
python-venv ×1
siblings ×1
testing ×1