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


71

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

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

test2.m(matlab)

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

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

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


1
是的,您可以将文件拆分为不同的模块,然后导入所需的文件。docs.python.org/tutorial/modules.html
— Borgleader 2012年

5
阅读你喜欢的Python的教程,了解模块
— 安德烈亚斯·荣格

从python1_file进口*
— Shubh

Answers:


42

我现在正在研究python中的模块用法,并认为我将从两个角度回答Markus在上面的评论中提出的问题(“如何将变量嵌入模块中时导入变量?”):

  1. 变量/函数,以及
  2. 类属性/方法。

这是我重写主程序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

我认为Markus的要点是:

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

68

当然!

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

现在,此文件(“ test.py”)在python术语中为“模块”。我们可以导入它(只要可以在我们PYTHONPATH的目录中找到它)。请注意,当前目录始终在中PYTHONPATH,因此,如果use_test从所在目录运行test.py,则已全部设置:

#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
好吧,也许我的榜样不是很好。我希望能够使用所有变量来调用我的额外代码。导入模块对我没有多大帮助,因为我需要传输变量,不是吗?
— 马库斯(Markus)2012年

1
变量也可以导入,尽管它不是很常见,并且您通常不想这样做...(请参阅我的更新)
— mgilson 2012年

嗯...比我想像的要容易得多!
— 约翰·亨特

22

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

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

或使用命名空间:

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

4

您可以通过简单地导入第二个文件在python中进行相同的操作,导入时将在顶层运行代码。我建议这充其量是一团糟,而不是一种好的编程习惯。您最好将代码组织到模块中

例:

F1.py:

print "Hello, "
import f2

F2.py:

print "World!"

运行时:

python ./f1.py
Hello, 
World!

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


如果我将其粘import f2在一个循环中,它只会写入World!一次。我可以以某种方式更改它吗?
— Markus

1
我会将print语句(在f2.py中)放在函数中,仅导入文件一次,然后在循环中调用新函数。
— 卡尔·格罗纳

但这就是我在调用带有主代码和“子代码”中所需变量的实际代码时遇到的麻烦
— Markus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.