【问题标题】:How do I import symbols inside a Python package?如何在 Python 包中导入符号?
【发布时间】:2017-06-13 07:50:20
【问题描述】:

我想将三个与数据库相关的类合并到一个包中,结构如下:

adodb_pyodbc /
    __init__.py  # empty
    PyConnection.py
    PyRecordset.py
    PyField.py

这个包在我的 Lib/site-packages 文件夹中。

在此尝试的早期迭代中,我没有使用“Py”前缀,并且我收到一个错误,抱怨 module.__init__() 只接受两个参数,并且传递了三个参数。有人说“Recordset”这个名字可能和别的东西有冲突,所以我改了。

当文件与使用它们的项目位于同一文件夹中时,这些类将起作用。在这种情况下,我可以使用:

PyRecordset.py:

from PyConnection import PyConnection
from PyField import PyField

class PyRecordset: pass

DerivedSet.py

from PyRecordset import PyRecordset

class DerivedRecordset(PyRecordset): pass

但是当它们位于包中时,相同的文件不起作用。我的测试程序以这一行开头:

from adodb_pyodbc import PyConnection as Connection

当我运行它时,我收到以下错误消息:

C:\Python35\python.exe "C:/Customers/Nucor Crawfordsville/Scripts/64 bit/Testing/cpsa_simulator.py"
Traceback (most recent call last):
  File "C:/Customers/Nucor Crawfordsville/Scripts/64 bit/Testing/cpsa_simulator.py", line 8, in <module>
    from Level3_CoilsSet import Level3_CoilsSet
  File "C:\Customers\Nucor Crawfordsville\Scripts\64 bit\Testing\Level3_CoilsSet.py", line 1, in <module>
    from adodb_pyodbc import PyRecordset as Recordset
  File "C:\Python35\lib\site-packages\adodb_pyodbc\PyRecordset.py", line 9, in <module>
    from PyConnection import PyConnection
ImportError: No module named 'PyConnection'

但是在 PyCharm 中编辑 PyRecordset.py 时,似乎可以找到 PyConnection.py 文件。

我尝试在 PyConnection.py 中使用相对寻址:

from . import PyConnection
from . import PyField

但这让我回到了__init__() 错误:

C:\Python35\python.exe "C:/Customers/Nucor Crawfordsville/Scripts/64 bit/Testing/cpsa_simulator.py"
Traceback (most recent call last):
  File "C:/Customers/Nucor Crawfordsville/Scripts/64 bit/Testing/cpsa_simulator.py", line 8, in <module>
    from Level3_CoilsSet import Level3_CoilsSet
  File "C:\Customers\Nucor Crawfordsville\Scripts\64 bit\Testing\Level3_CoilsSet.py", line 3, in <module>
    class Level3_CoilsSet(Recordset):
TypeError: module.__init__() takes at most 2 arguments (3 given)

我该怎么做?

非常感谢您的帮助。同时,我将从包中取出这些文件,并将它们放回我的测试项目中。我在这个问题上浪费了太多时间。

【问题讨论】:

标签: python python-3.x import


【解决方案1】:

当您从包外部使用PyConnection 时,您必须从定义它的模块中导入它:

from adodb_pyodbc.PyConnection import PyConnection as Connection

或者,更方便的是,在包初始化文件adodb_pyodbc/__init__.py中导入:

from .PyConnection import PyConnection

然后,从外部,您可以这样做:

from adodb_pyodbc import PyConnection as Connection

【讨论】:

  • 大 +1 用于将导入放入 __init__。我几乎误读了您的问题,并认为您与自己的正确陈述相矛盾:)
  • 明白了!我尝试(可能不够努力)找出__init__.py 的用途,但没有成功。非常感谢!
猜你喜欢
  • 2012-01-22
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多