80

我有一个代码,我希望将其拆分为多个文件。在 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

4 回答 4

75

当然!

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

现在,这个文件(“test.py”)在 python 术语中是一个“模块”。我们可以导入它(只要它可以在我们PYTHONPATH的.PYTHONPATHuse_testtest.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),但这回答了您的问题,我想我们会把剩下的留到下一次。

于 2012-09-13T18:38:29.983 回答
47

我现在正在研究 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

我认为马库斯的重点是:

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

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

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

或者使用命名空间:

>>> import test
>>> test.disp('World!')
于 2012-09-13T18:38:21.047 回答
5

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

例子:

F1.py:

print "Hello, "
import f2

F2.py:

print "World!"

运行时:

python ./f1.py
Hello, 
World!

编辑澄清:我建议的部分是“混乱”,import只是为了产生输出的副作用,而不是创建单独的源文件。

于 2012-09-13T18:38:54.913 回答