我目前使用Python,并已在混淆其功能中列出的事实__main__
。 我一直在寻找在多个Python脚本,试图找到一个共同的主题,以什么功能,在保证一个地方__main__
,但无济于事。 在这里,我有我自己的代码样本。 firstfunction
和anotherfunction
是在我的代码只有两个功能。
def main(argv):
firstinput=""
secondinput=""
if len(argv) < 3 or len(argv) > 3:
print """"Please set to:
metisfinal.main(metisfinal.py, firstinput, secondinput)""""
return
else:
firstinput = argv[1]
secondinput = argv[2]
firstfunction(firstinput, dictionary)
anotherfunction(list, secondinput)
if __name__ == "__main__":
main(sys.argv)
(我认为)我知道的参数和__main__
调用是正确的,但firstfunction
和anotherfunction
总是返回错误(因为他们的观点没有全局定义)。 我敢肯定,这是从一个错误的认识而产生__main__
,因为所有其他的例子,我看了一下,基本建立__main__
以同样的方式。
何谓列出特定功能__main__
? 我已经绊倒具有向上的内它30种功能的一些Python代码,但程序员仅中列出的那些功能2 __main__
。 同样地,有时一个代码将具有在主参数类,像这样的( Project
被较早定义为对象类):
def main(argv):
filename = ""
outputfilename = ""
p = Project(filename, outputfilename, subdomainNames)
p.generateICs()
if __name__ == "__main__":
main(sys.argv)
从概念上讲,我不明白为什么没有列出所有的功能...不要他们都需要运行或__main__
只是初始化的东西吗?
上午我在看非典型的代码? 什么关键概念的__main__
我缺少什么? 有一次我确实觉得放什么功能集成到__main__
,有没有格式化一个特定的方式?
目前尚不清楚你所说的“中列出的意思__main__
”。 __main__
不是在源文件中的一个实体。 相反,它是模块的名称 ,如果你直接执行它。 当你这样做if __name__=="__main__"
,你告诉Python的当且仅当该代码被作为主要的模块执行该块来执行代码---也就是说,如果它是一个程序正在运行。 在该代码if __name__=="__main__"
块将不被如果模块从另一个模块进口运行。
请注意,您在,如果块不“列表”功能。 取而代之的是,你把一般的程序代码中要运行该块。 通常这种代码只是调用一个函数。 人们常常调用这个函数main()
。 但之间没有特殊关系__main__
和main
。 您可以调用函数任何你喜欢的:
def snicklefritz():
# This function will be run when you run the program
print "You ran the program!"
if __name__ == "__main__":
snicklefritz()
试运行这个程序(比如,通过将其保存为“snicklefritz.py”,然后做python snicklefritz.py
在命令行)。 你会看到“你运行该程序!” 打印。 相反,如果你创建一个单独的文件,做import snicklefritz
,该消息不会被打印出来。
请注意,有没有什么关于“上市功能”。 例如,看一下这个程序:
print "This will always be printed!"
if __name__ == "__main__":
print "This will only be printed if you run the file as a program!"
在这里, if __name__=="__main__"
块没有“名单”的任何功能。 它只是包含在文件被运行的脚本运行实际的代码。 人们通常不这样做,不过,因为它更整洁有一个单独的函数,而不是函数的只是坐在那里“暴露”以外的代码。
至于其他功能,您可以定义你的模块在喜欢的任何其它功能,要在该模块中使用,也可以,或者通过导入模块,其他模块使用。 通常,大多数的模块中的功能将不会在内部使用if __name__=="__main__"
块,因为它们不会是“主”函数的一部分。 相反,他们将用于其他代码使用其他功能。 例如:
def otherFunc(x):
# Return x squared
return x**2
def snicklefritz():
# This function will be run when you run the program
print "You ran the program!"
if __name__ == "__main__":
snicklefritz()
otherFunc
没有在模块中使用的。 没关系。 这可能是有人将要导入模块,并使用otherFunc
自己。 并不是每一个函数必须在同一个模块内使用,更不用说从被叫if __name__=="__main__"
块。
你是误会__main__
成语。
考虑下面的程序,保存在一个文件名为sum.py
:
def read_numbers():
n1 = int(raw_input())
n2 = int(raw_input())
return n1, n2
def sum_numbers(i1, i2):
return i1+i2
def print_sum(i1, i2, i3):
print "%d + %d = %d" % (i1, i2, i3)
v1, v2 = read_numbers()
sum = sum_numbers(v1, v2)
print_sum(v1, v2, sum)
它有三个功能 - 一个从标准输入读取两个数字,另一个对其求和,第三个打印操作。 定义功能后,我打电话给他们在我们读两个数字并打印其总和这样的方式。 相当容易的。 如果我执行它,我得到的是这样的:
$ python sum.py
12
34
12 + 34 = 46
现在,假设我需要写另一个程序,这将只读一个号码 - 对方号码居然中给出。 因为我已经有一个sum_numbers()
函数和print_sum()
函数,我可以下跌诱惑重用sum
模块,这是一件好事:
import sum
MY_FIXED_NUMBER=3
n = int(raw_input())
value = sum.sum_numbers(n, MY_FIXED_NUMBER)
print_sum(n, MY_FIXED_NUMBER, value)
大! 不过,如果我执行它,我得到了什么? 这个:
$ python three_sum.py
12
34
12 + 34 = 46
12
12 + 3 = 15
WAT? 该方案要求我有两个数字,印刷两者之和,然后问了第三个数字,这是正确的概括为3。我只想问的第三个数字,正好与3打印的总和! 发生了什么?
碰巧的是,当我导入一个模块(如import sum
),它里面的所有代码被执行。 所以,我的模块有两个部分,一个定义可以用于其他地方(我称之为定义部分 )有用的功能,以及它执行的方式来获得一个特定的结果此功能的一部分,所以我可以使用模块作为一个程序(我将调用执行部 )。 执行部始终执行。
幸运的是,Python有一个绝招,让我来执行,只有当模块没有导入的执行部分。 如果我用导入一个Python文件import
,该模块将有一个名为变量__name__
,他的名字将是模块的原始名称:
>>> import sum
12
34
12 + 34 = 46
>>> sum.__name__
'sum'
但是,如果我跑了Python文件作为脚本( $ python sum.py
),该__name__
变量将在那里,但使用不同的名称。 假设我添加一行如
print __name__
在我结束sum.py
。 当我再次运行它,我得到了它:
$ python sum.py
12
34
12 + 34 = 46
__main__
在另一方面,如果我跑three_sum.py
,结果print __name__
的方式不同:
$ python three_sum.py
12
34
12 + 34 = 46
sum
12
12 + 3 = 15
是的,价值__name__
运行该文件作为脚本时变量是__main__
。
所以,这怎么能帮助我吗? 是这样的:我会把我模块的执行部分中if
条件。 如果模块的名称__main__
,这是因为该文件正在作为一个脚本$ python sum.py
-在这种情况下,我要执行我的模块的执行部分。 所以我sum.py
模块将是这个样子,现在:
def read_numbers():
n1 = int(raw_input())
n2 = int(raw_input())
return n1, n2
def sum_numbers(i1, i2):
return i1+i2
def print_sum(i1, i2, i3):
print "%d + %d = %d" % (i1, i2, i3)
if __name__ == "__main__":
v1, v2 = read_numbers()
sum = sum_numbers(v1, v2)
print_sum(v1, v2, sum)
如果我运行$ python sum.py
,我得到和以前一样:
$ python sum.py
12
34
12 + 34 = 46
但是,如果我跑three_sum.py
,一切都不同了:
$ python three_sum.py
12
12 + 3 = 15
现在,这个工作正常。 它的工作原理这种方式,因为在第一次执行模块的名称是__main__
,所以命令下if __name__ == "__main__"
被执行。 在第二执行,然而,模块的名称是sum
,所以下的命令if
不执行。
即使您的文件不被设计成进口的,它仍然是一个很好的做法,把你的文件的执行部分下if __name__ == "__main__"
,所以你的文件很容易适应,成为一个模块。