如何在完整路径下加载Python模块?请注意,该文件可以位于文件系统中的任何位置,因为它是一个配置选项.
我正在尝试遵循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 "和" 从相对路径导入模块 ",但它们没有帮助.
这里有什么我想念的吗?
我想从同一目录中的另一个文件导入一个函数.
有时它适用于我,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)
我不明白这里的逻辑,我找不到任何解释.这看起来完全随机.
有人可以向我解释这一切背后的逻辑是什么吗?
我有一个存储所有.py文件的目录.
bin/
main.py
user.py # where class User resides
dir.py # where class Dir resides
Run Code Online (Sandbox Code Playgroud)
我想在main.py中使用user.py和dir.py中的类.
如何将这些Python类导入main.py?
此外,User
如果user.py位于子目录中,如何导入类?
bin/
dir.py
main.py
usr/
user.py
Run Code Online (Sandbox Code Playgroud) 想象一下这个目录结构:
app/
__init__.py
sub1/
__init__.py
mod1.py
sub2/
__init__.py
mod2.py
Run Code Online (Sandbox Code Playgroud)
我正在编码mod1
,我需要从中导入一些东西mod2
.我该怎么办?
我尝试了from ..sub2 import mod2
但是我得到了"尝试非包装中的相对导入".
我google了一下,但发现只有" sys.path
操纵"黑客.有没有干净的方式?
编辑:我__init__.py
的所有人目前都是空的
EDIT2:我想这样做,因为SUB2包含了为子包(共享类sub1
,subX
等等).
Edit3:我正在寻找的行为与PEP 366中描述的相同(感谢John B)
我正在构建一个简单的帮助脚本,用于将代码库中的几个模板文件复制到当前目录.但是,我没有存储模板的目录的绝对路径.我确实有一个来自脚本的相对路径,但是当我调用脚本时,它将其视为相对于当前工作目录的路径.有没有办法指定这个相对url来自脚本的位置?
建议不要import *
在Python中使用.
任何人都可以分享原因,以便我下次可以避免它吗?
如何.py
在Python 3.3+中导入任意python源文件(其文件名可以包含任何字符,并不总是以其结尾)?
我使用imp.load_module
如下:
>>> import imp
>>> path = '/tmp/a-b.txt'
>>> with open(path, 'U') as f:
... mod = imp.load_module('a_b', f, path, ('.py', 'U', imp.PY_SOURCE))
...
>>> mod
<module 'a_b' from '/tmp/a-b.txt'>
Run Code Online (Sandbox Code Playgroud)
它仍然适用于Python 3.3,但根据imp.load_module
文档,它已被弃用:
从版本3.3开始不推荐使用:不需要使用加载器来加载模块,并且不推荐使用find_module().
和imp
模块文档建议使用importlib
:
注意新程序应使用importlib而不是此模块.
在不使用已弃用的imp.load_module
函数的情况下,在Python 3.3+中加载任意python源文件的正确方法是什么?
我有一个名为"ClassA"的Python类和另一个应该导入ClassA的Python类,它是"ClassB".目录结构如下:
MainDir
../Dir
..../DirA/ClassA
..../DirB/ClassB
Run Code Online (Sandbox Code Playgroud)
我如何使用sys.path
以便ClassB可以使用ClassA?
嘿所有 - 我用Python中的相对导入拉出我的头发.我已经阅读了30次文档和SO和其他论坛上的大量帖子 - 似乎仍然没有用.
我的目录结构目前看起来像这样
src/
__init__.py
main.py
components/
__init__.py
expander.py
language_id.py
utilities/
__init__.py
functions.py
Run Code Online (Sandbox Code Playgroud)
我希望expandder.py和language_id.py可以访问函数模块.我运行python main.py,它可以从components.expander import*和components.language_id import*访问模块.
但是,在expandder和language_id中的代码访问函数模块:
from ..utilities.functions import *
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
ValueError: Attempted relative import beyond toplevel package
Run Code Online (Sandbox Code Playgroud)
我已经过了很多次,它似乎遵循文档.任何人都对这里出了什么问题有任何想法?
python ×10
path ×2
python-3.x ×2
directory ×1
importerror ×1
init ×1
package ×1
parent ×1
python-3.3 ×1
sys ×1