将python源代码拆分成多个文件?

时间:2012-09-13 18:33:11

标签: python

我有一个代码,我希望将其拆分为多个文件。在matlab中,可以简单地调用.m文件,只要它没有被定义为特定的任何东西,它就会像被调用的代码一样运行。示例(已编辑):
test.m (matlab)

function [] = test()
    ... some code using variables ...
    test2

test2.m (matlab)

... some more code using same variables ...

调用test运行test中的代码以及test2中的代码。

python是否有类似的方式将... some more code ...放入外部文件中,只是将其读取就好像它在调用它的文件中一样?

4 个答案:

答案 0 :(得分:52)

当然!

#file  -- test.py --
myvar = 42
def test_func():
    print("Hello!")

现在,这个文件(“test.py”)在python术语中是一个“模块”。我们可以导入它(只要它可以在我们的PYTHONPATH中找到)请注意,当前目录总是在PYTHONPATH中,所以如果use_testtest.py运行{ {1}}生活,你已经准备好了:

#file -- use_test.py --
import test
test.test_func()  #prints "Hello!"
print (test.myvar)  #prints 42

from test import test_func #Only import the function directly into current namespace
test_func() #prints "Hello"
print (myvar)     #Exception (NameError)

from test import *
test_func() #prints "Hello"
print(myvar)      #prints 42

通过使用允许您将多个文件视为单个模块的特殊__init__.py文件,您可以做更多的事情,但这会回答您的问题,我想我们会离开再休息一次。

答案 1 :(得分:31)

我刚才正在研究python中的模块用法,并且我认为我会回答Markus在上面的评论中提出的问题(“当它们嵌入到模块中时如何导入变量?”)从两个角度来看:

  1. 变量/功能,和
  2. class property / method。
  3. 以下是我将如何重写主程序f1.py以演示Markus的变量重用:

    import f2
    myStorage = f2.useMyVars(0) # initialze class and properties
    for i in range(0,10):
        print "Hello, "
        f2.print_world()
        myStorage.setMyVar(i)
        f2.inc_gMyVar()
    print "Display class property myVar:", myStorage.getMyVar()
    print "Display global variable gMyVar:", f2.get_gMyVar()
    

    以下是我将如何重写可重用模块f2.py:

    # Module: f2.py
    # Example 1: functions to store and retrieve global variables
    gMyVar = 0
    def print_world():
        print "World!"
    def get_gMyVar():
        return gMyVar # no need for global statement 
    def inc_gMyVar():
        global gMyVar
        gMyVar += 1  
    
    # Example 2: class methods to store and retrieve properties
    class useMyVars(object):
        def __init__(self, myVar):
            self.myVar = myVar
        def getMyVar(self):
            return self.myVar
        def setMyVar(self, myVar):
            self.myVar = myVar
        def print_helloWorld(self):
            print "Hello, World!"
    

    执行f1.py时,输出结果如下:

    %run "f1.py"
    Hello, 
    World!
    Hello, 
    World!
    Hello, 
    World!
    Hello, 
    World!
    Hello, 
    World!
    Hello, 
    World!
    Hello, 
    World!
    Hello, 
    World!
    Hello, 
    World!
    Hello, 
    World!
    Display class property myVar: 9
    Display global variable gMyVar: 10
    

    我认为马库斯的观点是:

    • 要多次重复使用模块的代码,请将模块的代码放入 功能或类,
    • 要重用存储为模块中属性的变量,请初始化 类中的属性并添加“getter”和“setter”方法 变量不必复制到主程序中,
    • 要重用存储在模块中的变量,请初始化变量并使用 getter和setter函数。 setter函数会声明 变量为全球变种。

答案 2 :(得分:20)

Python有导入和命名空间,这很好。在Python中,您可以导入到当前名称空间,例如:

>>> from test import disp
>>> disp('World!')

或者使用命名空间:

>>> import test
>>> test.disp('World!')

答案 3 :(得分:3)

您可以通过简单地导入第二个文件在python中执行相同操作,顶级代码将在导入时运行。我认为这最好是混乱,而不是一个好的编程习惯。最好将代码组织到modules

示例:

F1.py:

print "Hello, "
import f2

F2.py:

print "World!"

运行时:

python ./f1.py
Hello, 
World!

编辑澄清:我建议的部分“凌乱”仅使用import语句来生成输出的副作用,而不是创建单独的源文件。