相关疑难解决方法(0)

2074
推荐指数
12
解决办法
100万
查看次数

如何修复"非包装中的尝试相对导入",即使使用__init__.py也是如此

我正在尝试遵循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 init package python-import importerror

713
推荐指数
9
解决办法
47万
查看次数

相对进口数十亿次

我来过这里:

还有很多我没有复制的网址,有些在SO上,有些在其他网站上,当我认为我有快速解决方案的时候.

永远反复出现的问题是:使用Windows 7,32位Python 2.7.3,如何解决这个"非包装中尝试相对导入"的消息?我在pep-0328上构建了一个包的精确副本:

package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
    moduleA.py
Run Code Online (Sandbox Code Playgroud)

我确实在适当的模块中创建了名为spam和eggs的函数.当然,它没有用.答案显然在我列出的第4个网址中,但这对我来说都是校友.我访问过的其中一个网址上有此回复:

相对导入使用模块的name属性来确定模块在包层次结构中的位置.如果模块的名称不包含任何包信息(例如,它设置为'main'),则解析相对导入,就像模块是顶级模块一样,无论模块实际位于文件系统的哪个位置.

上面的反应看起来很有希望,但它对我来说都是象形文字.所以我的问题是,如何让Python不回归"尝试非包装中的相对导入"?有一个答案涉及-m,据说.

有人可以告诉我为什么Python会给出错误信息,非包装意味着什么!,为什么以及如何定义"包裹",并且准确的答案足以让幼儿园儿童理解.

编辑:导入是从控制台完成的.

python import relative-path python-2.7

564
推荐指数
8
解决办法
17万
查看次数

如何在Python中进行相对导入?

想象一下这个目录结构:

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)

python python-module python-import

508
推荐指数
11
解决办法
31万
查看次数

是否可以使用pip从私有github存储库安装包?

正如标题所示,我试图从私有github仓库安装一个python包.对于公共存储库,我可以发出以下命令,该命令工作正常:

pip install git+git://github.com/django/django.git
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用私有存储库:

pip install git+git://github.com/echweb/echweb-utils.git
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

Downloading/unpacking git+git://github.com/echweb/echweb-utils.git
Cloning Git repository git://github.com/echweb/echweb-utils.git to /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build
Complete output from command /usr/local/bin/git clone git://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build:
fatal: The remote end hung up unexpectedly

Cloning into /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build...

----------------------------------------
Command /usr/local/bin/git clone git://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build failed with error code 128
Run Code Online (Sandbox Code Playgroud)

我想这是因为我试图访问私有存储库而不提供任何身份验证.因此我尝试使用git + ssh希望pip使用我的ssh公钥进行身份验证:

pip install git+ssh://github.com/echweb/echweb-utils.git
Run Code Online (Sandbox Code Playgroud)

这给出了以下输出:

Downloading/unpacking git+ssh://github.com/echweb/echweb-utils.git
Cloning Git repository ssh://github.com/echweb/echweb-utils.git to /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build
Complete output from command /usr/local/bin/git clone ssh://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build:
Cloning into /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build...

Permission denied (publickey).

fatal: The remote end hung …
Run Code Online (Sandbox Code Playgroud)

python git pip github

321
推荐指数
13
解决办法
19万
查看次数

Python的eval()做什么?

在我正在阅读Python的书中,它继续使用代码 eval(input('blah'))

我阅读了文档,我理解它,但我仍然没有看到它如何改变input()功能.

它有什么作用?谁能解释一下?

python eval

280
推荐指数
10
解决办法
42万
查看次数

Python 3中的包不需要__init__.py吗?

我使用的是Python 3.5.1.我在这里阅读了文档和包部分:https://docs.python.org/3/tutorial/modules.html#packages

现在,我有以下结构:

/home/wujek/Playground/a/b/module.py
Run Code Online (Sandbox Code Playgroud)

module.py:

class Foo:
    def __init__(self):
        print('initializing Foo')
Run Code Online (Sandbox Code Playgroud)

现在,在/home/wujek/Playground:

~/Playground $ python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x100a8f0b8>
Run Code Online (Sandbox Code Playgroud)

同样,现在在家里,超级文件夹Playground:

~ $ PYTHONPATH=Playground python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x10a5fee10>
Run Code Online (Sandbox Code Playgroud)

实际上,我可以做各种各样的事情:

~ $ PYTHONPATH=Playground python3
>>> import a
>>> import a.b
>>> import Playground.a.b
Run Code Online (Sandbox Code Playgroud)

为什么这样做?我虽然有被需要的__init__.py文件(空的都可以)两种a,并bmodule.py要导入的时候Python的路径指向Playground文件夹?

这似乎已经从Python 2.7改变了:

~ $ PYTHONPATH=Playground …
Run Code Online (Sandbox Code Playgroud)

python package python-3.x

146
推荐指数
5
解决办法
6万
查看次数

PyCharm错误:尝试导入自己的模块时没有模块(python脚本)

我写了一个模块(文件my_mod.py夹中的文件文件my_module).目前,我正在cool_script.py使用驻留在该文件夹中的文件cur_proj.我已经使用File - open打开了PyCharm中的文件夹(我假设,因此,它是一个PyCharm项目).

在ProjectView(CMD-7)中,我可以看到我的项目cur_proj(红色)和"外部库"下的内容my_module.在cool_script.py中,我可以写

from my_module import my_mod as mm
Run Code Online (Sandbox Code Playgroud)

而PyCharm甚至为my_mod提出建议.到现在为止还挺好.

但是,当我尝试运行cool_script.py时,PyCharm告诉我 "没有名为my_module的模块"

这对我来说很奇怪,因为

A)在终端(OS 10.10.2)中,在python中,我可以导入模块没问题 - .bashrc中的PYTHONPATH中有相应的条目

B)在PyCharm中 - 设置 - 项目cur_proj - 项目解释器 - 在python解释器旁边的CogWheel - 更多 - 显示所选解释器图标的路径,PYTHONPATH的路径确实出现(我认为应该这样)

因此,当我尝试运行cool_script.py时,为什么会出现错误?- 我错过了什么?

笔记:

附录2015年2月25日

当我进入PyCharm运行 - 编辑配置时,对于我当前的项目,有两个选项带有复选标记:" 将内容根添加到PYTHONPATH "和" 将源根添加到PYTHONPATH ".当我同时取消选中时,我可以加载我的模块.

所以它现在有效 - 但为什么呢?

出现了更多问题:

  • 什么是"内容根源"和什么是"源根"?为什么在PYTHONPATH中添加一些东西会让它以某种方式破坏?
  • 我是否应该一直取消选中这两个选项(默认情况下,不仅是项目特定的配置(运行/调试配置对话框的左侧面板)?

python module pycharm

127
推荐指数
7
解决办法
14万
查看次数

Python:使用'from X import Y'重新加载组件Y?

在Python中,一旦我在解释器会话中导入模块X import X,并且模块在外部更改,我可以重新加载模块reload(X).然后,在我的翻译会话中可以使用这些更改.

我想知道当我从模块X导入组件Y时是否也可以这样做from X import Y.

该语句reload Y不起作用,因为Y本身不是模块,而只是模块内部的一个组件(在本例中是一个类).

是否可以在不离开解释器会话(或导入整个模块)的情况下重新加载模块的各个组件?

编辑:

为了澄清,问题是从模块X导入类或函数Y并重新加载更改,而不是从包X中重新模块Y.

python python-import

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

从另一个文件导入类

在将其标记为重复之前,请阅读我的问题:

我试图从子目录中的文件导入一个类

> main.py
> --->folder/
> ----->file.py
Run Code Online (Sandbox Code Playgroud)

file.py我有一个类imlpemented(Klasa)我尝试了什么:

放入main.py:

from folder import file
from file import Klasa
Run Code Online (Sandbox Code Playgroud)

我收到错误:

从文件导入Klasa

ImportError:没有名为'file'的模块

当我尝试使用时:

from folder import file
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

tmp = Klasa()

NameError:未定义名称"Klasa"

__init__.py在子文件夹中放了一个空,它仍然不起作用,我已经放入__init__.py :但仍然无法正常from file import Klasa工作.

如果main和file在同一个文件夹中,则可以正常工作:

from file import Klasa

但我希望他们在单独的文件中.

有人能告诉我我做错了什么吗?

python python-3.x

70
推荐指数
1
解决办法
21万
查看次数