相关疑难解决方法(0)

'尝试在非包中进行相对导入'尽管在一个目录中包含__init__.py

我有一个名为的模块extended.py,其中包含以下行:

from .basic import BasicModule
Run Code Online (Sandbox Code Playgroud)

并且该文件与此目录basic.py位于同一目录中__init__.py.但是,当我尝试运行它时:

python extended.py
Run Code Online (Sandbox Code Playgroud)

我收到错误:

ValueError: Attempted relative import in non-package
Run Code Online (Sandbox Code Playgroud)

还添加了这一行:

from __future__ import absolute_import
Run Code Online (Sandbox Code Playgroud)

没有解决问题.也许我太累了,看不到明显的 - 但我没有看到这里的问题.

python python-import python-2.7

29
推荐指数
1
解决办法
5万
查看次数

在嵌套包中导入模块

这是一个python新手问题:

我有以下目录结构:

test
 -- test_file.py
a
 -- b
   -- module.py    
Run Code Online (Sandbox Code Playgroud)

其中test,ab是文件夹.双方testa都在同一水平上.

module.py有一个名为的类shape,我想在test_file.py中实例化它的一个实例.我怎么能这样做?

我试过了:

from a.b import module
Run Code Online (Sandbox Code Playgroud)

但我得到了:

ImportError: No module named a.b
Run Code Online (Sandbox Code Playgroud)

python import package

26
推荐指数
3
解决办法
3万
查看次数

如何在Python模块中正确使用相对或绝对导入?

在Python中使用相对导入有一个缺点,您将无法再将模块作为独立模块运行,因为您将获得异常: ValueError: Attempted relative import in non-package

# /test.py: just a sample file importing foo module
import foo
...

# /foo/foo.py:
from . import bar
...
if __name__ == "__main__":
   pass

# /foo/bar.py: a submodule of foo, used by foo.py
from . import foo
...
if __name__ == "__main__":
   pass
Run Code Online (Sandbox Code Playgroud)

我应该如何修改样本代码,以便能够执行所有:test.py,foo.pybar.py

我正在寻找一个适用于python 2.6+(包括3.x)的解决方案.

python module packages python-module python-import

26
推荐指数
2
解决办法
2万
查看次数

Django:打破观点

这实际上只是一个"最佳实践"问题......

我发现在开发应用程序时,我经常会得到很多观点.

通常的做法是将这些视图分解为多个视图文件吗?换句话说......而不仅仅是拥有views.py,是否常见于views_1.py,views_2.py,views_3.py(但更合适,可能按类别命名)?

django django-views

22
推荐指数
1
解决办法
5042
查看次数

何时使用绝对导入

我正在改变一堆旧的python代码,偶尔会遇到包之间的名称冲突.我有一个关于何时应该使用绝对导入以及是否适合仅按名称导入同级模块的问题.

/package/
/package/__init__.py
/package/subA
/package/subA/__init__.py
/package/subA/moduleA.py
/package/subA/moduleB.py
/package/subB
/package/subB/__init__.py
/package/subB/moduleA.py
/package/subB/moduleB.py
Run Code Online (Sandbox Code Playgroud)

包中的每个import语句应该是这样的:

import package.subX.moduleX
Run Code Online (Sandbox Code Playgroud)

要么

from package.subX import moduleX
Run Code Online (Sandbox Code Playgroud)

在子包__init__.py文件中怎么样?简单地说是不对的

import moduleA
import moduleB
Run Code Online (Sandbox Code Playgroud)

或者,在/package/subA/moduleA.py中,简单地放入是不对的:

import moduleB
Run Code Online (Sandbox Code Playgroud)

python import

17
推荐指数
1
解决办法
2万
查看次数

Python导入相对路径

我有一个项目,我想在其他目录中使用一些python类.

结构示例:

/dir
 +../subdirA
 +../subdirB
 +../mydir
Run Code Online (Sandbox Code Playgroud)

绝对路径不同,因为该项目在不同的机器上运行.

执行位于/ mydir中的MySampleClass的 python文件时,如何导入位于/ subdirA中的/ dirOtherClassA中的OtherClassRoot

我尝试过这样的事情:

from . import MySampleClass as msc
Run Code Online (Sandbox Code Playgroud)

要么

from ../ import MySampleClass as msc
Run Code Online (Sandbox Code Playgroud)

但这总是失败或给我错误消息,如非包装中尝试相对导入

那么,什么是相对导入python文件的正确方法?

任何输入都非常感谢:)

python import path relative-path

17
推荐指数
1
解决办法
5万
查看次数

在Python 3中从同一个包和包外部导入模块

好的,这个场景非常简单.我有这个文件结构:

.
??? interface.py
??? pkg
?   ??? __init__.py
?   ??? mod1.py
?   ??? mod2.py
Run Code Online (Sandbox Code Playgroud)

现在,这些是我的条件:

  • mod2需要导入mod1.
  • interface.py和mod2都需要作为主脚本独立运行.如果您愿意,可以将接口视为实际程序,将mod2视为软件包的内部测试程序.

因此,在Python 2,我只想做import mod1内部mod2.py两者python2 mod2.pypython2 interface.py预期会工作.

但是,如果我这样做,这是我不太了解的部分,使用Python 3.5.2 import mod1; 然后我可以做python3 mod2.py,但python3 interface.py抛出:ImportError: No module named 'mod1':(

所以,显然,python 3建议import pkg.mod1用来避免与内置模块的冲突.好的,如果我使用我可以做的python3 interface.py; 但后来我不能python3 mod2.py因为:ImportError: No module named 'pkg'

同样,如果我使用相对导入: from . import mod1然后python3 interface.py工作; 但mod2.py说SystemError: Parent module '' not loaded, …

import package python-3.x

14
推荐指数
1
解决办法
2861
查看次数

python中重复的导入路径模式

有没有其他选择可以防止在python中导入模块时键入重复的长路径。

当前代码:

from a.b.c.d.e.f.g import g1
from a.b.c.d.e.f.g import g2
from a.b.c.d.e.f.g.h import h1
from a.b.c.d.e.f.g.i import i1
Run Code Online (Sandbox Code Playgroud)

我尝试了以下代码:

ref_path = a.b.c.d.e.f.g
from ref_path import g1
from ref_path import g2
from ref_path.h import h1
from ref_path.i import i1
Run Code Online (Sandbox Code Playgroud)

但是不幸的是它没有用。我不能这样做,a.b.c.d.e.f.g import *因为中可能有太多模块ref_path

如果我能够做到这一点,我可以轻松地ref_paths从一个公共位置维护在不同模块中使用的不同公共资源。

python python-3.x

14
推荐指数
2
解决办法
259
查看次数

覆盖Python中的命名空间

假设有一个文件夹'/ home/user/temp/a40bd22344'.该名称是完全随机的,并且每次迭代都会发生变化.我需要能够使用固定名称在Python中导入此文件夹,比如'project'.我知道我可以将此文件夹添加到sys.path以启用导入查找,但有没有办法用'project'替换'a40bd22344'?

也许在init .py中有一些聪明的黑客攻击?

添加:

它需要是全局的 - 也就是说,其他脚本通过标准加载'project':

import project
Run Code Online (Sandbox Code Playgroud)

必须正常工作,而是加载a40bd22344.

python python-import

13
推荐指数
3
解决办法
2万
查看次数

ValueError:尝试非包中的相对导入而不是测试包

我知道这已被多次询问,但不知怎的,我无法克服这个错误.这是我的目录结构 -

project/
  pkg/
  __init__.py
  subpackage1/
        script1.py
        __init__.py
  subpackage2/
        script2.py
       __init__.py
Run Code Online (Sandbox Code Playgroud)

script2.py有:

class myclass:
    def myfunction:
Run Code Online (Sandbox Code Playgroud)

script1.py有

 from ..subpackage2 import script2   
Run Code Online (Sandbox Code Playgroud)

我也试过了

from ..subpackage2 import myclass
Run Code Online (Sandbox Code Playgroud)

这给了我:ValueError:在非包中尝试相对导入

任何帮助将非常感激.

python

12
推荐指数
1
解决办法
4万
查看次数