标签: python-import

开发 Python 包时导入的最佳实践是什么?

我正在尝试构建一个 Python 包,其中包含子模块和子包(“库”)。我到处寻找正确的方法来做到这一点,但令人惊讶的是我发现它非常复杂。当然,也经历了 StackOverFlow 中的多个线程。

问题如下:

  1. 为了从另一个目录导入模块或包,在我看来有两种选择:添加绝对路径到sys.path. b. 在包的主目录中的文件中安装包含该setuptools.setup函数setup.py的包 - 将包安装到site-packages正在使用的特定 Python 版本的目录中。

  2. 选项a对我来说似乎太笨拙了。选项b很棒,但我发现它不切实际,因为我当前正在工作和编辑包的源代码 - 当然,所做的更改不会更新到包的安装目录中。另外,Git 不跟踪包的安装目录,不用说我使用 Git 的原始目录。

总结一下这个问题: 从当前正在构建的 Python 包的子目录中自由、良好地导入模块和子包的最佳实践是什么?

我觉得我错过了一些东西,但到目前为止找不到合适的解决方案。

谢谢!

python packaging python-import

3
推荐指数
1
解决办法
1371
查看次数

模块的 __getattr__ 被调用两次

PEP-562引入__getattr__用于模块。在测试时,我注意到这个魔术方法在以这种形式调用时会被调用两次:from X import Y

文件_b.py

def __getattr__(name):
    print("__getattr__ called:", name)
Run Code Online (Sandbox Code Playgroud)

文件_a.py

from file_b import foo, bar
Run Code Online (Sandbox Code Playgroud)

输出

__getattr__ called: __path__
__getattr__ called: foo
__getattr__ called: bar
__getattr__ called: foo
__getattr__ called: bar
Run Code Online (Sandbox Code Playgroud)

我用以下命令运行它python file_a.py:解释器版本是:3.10.6

您能告诉我这背后的原因吗?

python module python-import python-3.x

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

TypeError:'module'对象在我的关于python模块的简单程序中是不可调用的

这是我的Python模块:

main.py
fib/
    __init__.py
    fib.py
    hello.py
Run Code Online (Sandbox Code Playgroud)

fib.py定义函数fib(),hello.py定义函数hello().

main.py

from fib import *
hello()
Run Code Online (Sandbox Code Playgroud)

__init__.py

__all__ = ["fib", "hello"]
Run Code Online (Sandbox Code Playgroud)

我只是为了练习而写这段代码.不用于工作

我跑main.py它打印:

Traceback (most recent call last):
  File "tes.py", line 5, in <module>
    hello()
TypeError: 'module' object is not callable
Run Code Online (Sandbox Code Playgroud)

为什么?我有名单你好__all__

python python-module typeerror python-import

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

Python3.3:带有textmining-1.0的ImportError

我安装了textmining-1.0.我无法导入它.当我输入

import textmining 
Run Code Online (Sandbox Code Playgroud)

在python3.3 shell中,我收到消息:

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    import textmining
  File "C:\Python33\lib\site-packages\textmining\__init__.py", line 2, in <module>
    import stemmer
ImportError: No module named 'stemmer'
Run Code Online (Sandbox Code Playgroud)

但是我可以看到stemmer.py存在于textmining-1.0文件夹中.这里出了什么问题?

python python-import

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

Python:导入导入模块的模块

所以在文件foo我导入模块:

import lib.helper_functions
import lib.config
Run Code Online (Sandbox Code Playgroud)

在helper_functions.py中,我有:

import config
Run Code Online (Sandbox Code Playgroud)

当我运行foo的main函数时,我得到一个ImportError

编辑:这是我的文件的结构

foo.py
lib/
    config.py
    helper_functions.py
Run Code Online (Sandbox Code Playgroud)

在helper_functions中导入配置会导致错误

Traceback (most recent call last):
  File "C:\Python33\foo.py", line 1, in <module>
    import lib.helper_functions
  File "C:\Python33\lib\helper_functions.py", line 1, in <module>
    import config
ImportError: No module named 'config'
Run Code Online (Sandbox Code Playgroud)

所以:当我运行foo.py时,解释器会抱怨helper_functions的import语句.然而,当我运行helper_functions的主要部分时,不会出现这样的错误.

python python-import

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

检测导入的模块

有没有办法让Python模块知道用户将其导入的内容?

例如,如果用户这样做import myModule as foo,是否有办法让代码myModule知道用户将其导入为foo

python module python-import

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

“模块中没有名称”导入错误

每当尝试linalg从中scipy 导入scipy或从scipy导入任何其他内容时,我都会收到“模块中没有名称”的导入错误。由于某些原因,它不喜欢linalg。奇怪的是,日食包括自动完成的linalg。

我试过了:

  • 删除解释器,然后再次添加
  • 将站点工具,scipy目录,甚至scipy / linalg目录添加到python解释器首选项下的库中。
  • 删除所有类文件
  • 导入linalg为其他名称
  • 重新安装Eclipse
  • 吓坏了

我在Ubuntu 14.04上运行anaconda

python pydev python-import

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

配置PyCharm IDE以按Eclipse的方式组织导入(Django开发)

我正在使用PyCharm进行Django Web应用程序开发.该工具很棒,除了我需要手动添加每个import语句(即'optimize imports'功能不起作用).

有没有办法使它的工作方式与Eclipse在开发Java应用程序时的工作方式相同?

python django python-import pycharm

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

面对python继承中的问题

试图用python测试继承.我的情况如下

在一个文件夹中,我有一个名为Asset_Base的基类和一个名为Asset的子类,它们如下所示.

Asset_Base.py文件中:

class Asset_Base(object):
    def __init__(self):
        pass

    def sayHello(self):
        print('Hello!')
Run Code Online (Sandbox Code Playgroud)

Asset.py文件中:

import Asset_Base
class Asset(Asset_Base):
    def __init__(self):
        pass

    def sayHello(self):
        super().sayHello()

a = Asset()
a.sayHello()
Run Code Online (Sandbox Code Playgroud)

我运行此Asset类时收到此错误 ..

class Asset(Asset_Base):
TypeError: module.__init__() takes at most 2 arguments (3 given)
Run Code Online (Sandbox Code Playgroud)

尝试了几件事之后,如果我只是改变下面的import语句就可以了

from Asset_Base import *

我是python的新手,并不确定它们之间的区别

import Asset_Basefrom Asset_Base import *

任何人都可以解释一下.

提前致谢.

python python-import python-3.x

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

为什么即使安装了软件包也无法导入opencv3?

我目前正在运行Python 3.5并使用Anaconda的Spyder作为我的IDE.我在Windows机器上运行它.

当我import cv3在代码顶部写入时,它会返回错误ImportError: No module named 'cv3'

我尝试使用conda install -c https://conda.binstar.org/menpo opencv3命令提示符中的命令再次安装opencv3 .它显然已经安装,因为它返回

Fetching package metabase...............
Solving package specifications: .
# All requested packages already installed.
# packages in environment at C:\Users\Joey\Anaconda3:
# opencv3       3.1.0       py35_0      https://conda.binstar.org/menpo
Run Code Online (Sandbox Code Playgroud)

我输入cv3错了吗?我该如何解决这个错误?


更新:尝试import cv3而不是import cv2但得到以下错误:ImportError: cannot import name 'cv2'.关于这两个错误的措辞是不同的,所以python必须承认安装了opencv但是由于某种原因它不起作用.有任何想法吗?

python python-import spyder anaconda opencv3.1

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