Skip to main content
 首页 » 编程设计

Python:随脚本交付的自定义包及其导入方式

2025年05月04日17Terrylee

我正在尝试理解包在 Python 中的工作方式。我的目标是只要求安装 Python,用户应该能够简单地 check out 脚本存储库并运行它。

相关文件(ls TestPackage.py Mypackage/的输出):

TestPackage.py 
 
Mypackage/: 
__init__.py 
SomeClass.py 

TestPackage.py 的内容:

from Mypackage import SomeClass 
 
print "Hello from TestPackage.py" 
 
the_instance = SomeClass() 
 
the_instance.hi() 

Mypackage/_init_.py 的内容:

class InsideInitPy(): 
    def hi(self): 
        print "Hi from InsideInitPy! (when importing package)" 
 
InsideInitPy().hi() 

Mypackage/SomeClass.py 的内容:

class SomeClass(): 
    def hi(self): 
        print "Hi from SomeClass in the package! (using explicit call)" 

运行测试脚本python TestPackage.py时:

Hi from InsideInitPy! (when importing package) 
Hello from TestPackage.py 
Traceback (most recent call last): 
  File "TestPackage.py", line 5, in <module> 
    the_instance = SomeClass() 
TypeError: 'module' object is not callable 

产生错误的行是 the_instance = SomeClass()。作为 来自 InsideInitPy 的嗨! (导入包时) 导入时写入控制台似乎可以找到包。

如何使用 TestPackage.py 中第一行的这些变体来使示例工作(以及优缺点):

  1. 从 Mypackage 导入 SomeClass
  2. 从 Mypackage 导入 *
  3. 导入我的包

用户是否站在与TestPackage.py相同的目录下是否影响导入?

请您参考如下方法:

不要混淆类和模块。

你有一个文件SomeClass.py。文件对应于模块。因此,import SomeClass 为您提供了一个模块。

在 SomeClass.py 中,您有一个类定义。该类是 SomeClass.SomeClass。所以你需要写

the_instance = SomeClass.SomeClass() 

或者,您可以从模块 MyPackage.SomeClass 导入类 SomeClass:

from MyPackage.Someclass import SomeClass