我正在尝试构建一个 Python 包,其中包含子模块和子包(“库”)。我到处寻找正确的方法来做到这一点,但令人惊讶的是我发现它非常复杂。当然,也经历了 StackOverFlow 中的多个线程。
问题如下:
为了从另一个目录导入模块或包,在我看来有两种选择:添加绝对路径到sys.path. b. 在包的主目录中的文件中安装包含该setuptools.setup函数setup.py的包 - 将包安装到site-packages正在使用的特定 Python 版本的目录中。
选项a对我来说似乎太笨拙了。选项b很棒,但我发现它不切实际,因为我当前正在工作和编辑包的源代码 - 当然,所做的更改不会更新到包的安装目录中。另外,Git 不跟踪包的安装目录,不用说我使用 Git 的原始目录。
总结一下这个问题: 从当前正在构建的 Python 包的子目录中自由、良好地导入模块和子包的最佳实践是什么?
我觉得我错过了一些东西,但到目前为止找不到合适的解决方案。
谢谢!
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模块:
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__
我安装了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文件夹中.这里出了什么问题?
所以在文件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模块知道用户将其导入的内容?
例如,如果用户这样做import myModule as foo,是否有办法让代码myModule知道用户将其导入为foo?
每当尝试linalg从中scipy
导入scipy或从scipy导入任何其他内容时,我都会收到“模块中没有名称”的导入错误。由于某些原因,它不喜欢linalg。奇怪的是,日食包括自动完成的linalg。
我试过了:
我在Ubuntu 14.04上运行anaconda
我正在使用PyCharm进行Django Web应用程序开发.该工具很棒,除了我需要手动添加每个import语句(即'optimize imports'功能不起作用).
有没有办法使它的工作方式与Eclipse在开发Java应用程序时的工作方式相同?
试图用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_Base 和 from Asset_Base import *
任何人都可以解释一下.
提前致谢.
我目前正在运行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但是由于某种原因它不起作用.有任何想法吗?