我有以下文件夹结构.
application/app/folder/file.py
我想从另一个驻留的Python文件中的file.py中导入一些函数
application/app2/some_folder/some_file.py
我试过了
from application.app.folder.file import func_name
和其他一些尝试,但到目前为止我无法正确导入.我怎样才能做到这一点?
我正在尝试遵循PEP 328,具有以下目录结构:
pkg/
__init__.py
components/
core.py
__init__.py
tests/
core_test.py
__init__.py
Run Code Online (Sandbox Code Playgroud)
在core_test.py我有以下import语句
from ..components.core import GameLoopEvents
Run Code Online (Sandbox Code Playgroud)
但是,当我运行时,我收到以下错误:
tests$ python core_test.py
Traceback (most recent call last):
File "core_test.py", line 3, in <module>
from ..components.core import GameLoopEvents
ValueError: Attempted relative import in non-package
Run Code Online (Sandbox Code Playgroud)
搜索周围我发现" 相对路径甚至不能使用__init__.py "和" 从相对路径导入模块 ",但它们没有帮助.
这里有什么我想念的吗?
即使是简单的Python模块,非常常见的目录结构似乎是将单元测试分成它们自己的test目录:
new_project/
antigravity/
antigravity.py
test/
test_antigravity.py
setup.py
etc.
Run Code Online (Sandbox Code Playgroud)
例如,看看这个Python项目如何.
我的问题是,实际运行测试的常用方法是什么?我怀疑这对除了我以外的所有人都是显而易见的,但你不能只是python test_antigravity.py从测试目录运行,因为import antigravity它将失败,因为模块不在路径上.
我知道我可以修改PYTHONPATH和其他搜索路径相关的技巧,但我不能相信这是最简单的方法 - 如果你是开发人员,那就没关系,但是如果他们只是想检查测试,那么期望用户使用是不现实的通过.
另一种选择只是将测试文件复制到另一个目录中,但它看起来有点愚蠢,并且忽略了将它们放在一个单独的目录中的重点.
那么,如果您刚刚将源代码下载到我的新项目中,您将如何运行单元测试?我更喜欢一个能让我对用户说的答案:"运行单元测试做X."
我想从同一目录中的另一个文件导入一个函数.
有时它适用于我,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文件夹中.
我有一个命令行脚本,我运行了很多参数.我现在已经到了一个我有太多参数的地方,我想也有一些字典形式的参数.
因此,为了简化操作,我希望使用设置文件来运行脚本.我真的不知道用什么库来解析文件.这样做的最佳做法是什么?我当然可以自己敲一些东西,但是如果有一些库,那我就是耳朵.
一些"要求":
pickle我希望它是一个可以轻松阅读和编辑的直接文本文件.一个简化的伪示例文件:
truck:
color: blue
brand: ford
city: new york
cabriolet:
color: black
engine:
cylinders: 8
placement: mid
doors: 2
Run Code Online (Sandbox Code Playgroud) 看来这里已经有一些关于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.导致此错误消息的原因是什么?
我想继承一个位于当前目录之上的文件中的类.
是否可以相对导入该文件?
我不能为我的生活得到python的相对导入工作.我创建了一个它不起作用的简单示例:
目录结构是:
/__init__.py
/start.py
/parent.py
/sub/__init__.py
/sub/relative.py
Run Code Online (Sandbox Code Playgroud)
/start.py 仅包含: import sub.relative
/sub/relative.py 只包含 from .. import parent
所有其他文件都是空白的.
在命令行上执行以下操作时:
$ cd /
$ python start.py
Run Code Online (Sandbox Code Playgroud)
我明白了:
Traceback (most recent call last):
File "start.py", line 1, in <module>
import sub.relative
File "/home/cvondrick/sandbox/sub/relative.py", line 1, in <module>
from .. import parent
ValueError: Attempted relative import beyond toplevel package
Run Code Online (Sandbox Code Playgroud)
我使用的是Python 2.6.为什么会这样?如何使这个沙盒示例工作?
我正在学习使用 python 编程,但在从包中的模块导入时遇到问题。我正在使用带有 Python 3.8.2 64 位的视觉工作室代码。
.vscode
??? ecommerce
? ??? __init__.py
? ??? database.py
? ??? products.py
? ??? payments
? ??? __init__.py
? ??? authorizenet.py
? ??? paypal.py
??? __init__.py
??? main.py
Run Code Online (Sandbox Code Playgroud)
在ecommerce/products.py我的文件中:
.vscode
??? ecommerce
? ??? __init__.py
? ??? database.py
? ??? products.py
? ??? payments
? ??? __init__.py
? ??? authorizenet.py
? ??? paypal.py
??? __init__.py
??? main.py
Run Code Online (Sandbox Code Playgroud)
这样我就可以Database从ecommerce/database.py文件中导入类。但我得到错误
ImportError : Attempted relative import with no known …Run Code Online (Sandbox Code Playgroud) python ×10
directory ×2
importerror ×2
module ×2
package ×2
import ×1
init ×1
parsing ×1
path ×1
pylint ×1
python-3.x ×1
settings ×1
unit-testing ×1
yaml ×1