我用python做了一个这样的包,使用distutils:
#! /usr/bin/env python
from distutils.core import setup
setup(name='mypackage4.py',
version='1.0',
description='Description',
packages=['mypackage4']
)然后,setup.py将其安装到我的python2.7/site-packages目录中。
当我跑的时候
import mypackage4它尝试运行mypackage4目录中的.py文件。该目录包含python文件,其中包含函数(def命令)。我所要做的就是让这些函数可用,而不是在导入时直接运行。
但是,如果我这样做的话
cd python2.7/site-packages然后执行导入,这样它就可以在本地拾取mypackage4,它不需要运行任何东西就可以导入,这样我就可以通过python命令行以正常的方式访问函数。
为什么当包不在本地目录中时,python似乎可以运行函数,而当包在本地目录中时,python却不运行函数?
其次,我读到过关于放置一个
if __name__ == '__main__':
pass
else:
<define functions here>命令来阻止它们运行,但它肯定不会运行这些函数,那么它是如何知道这些函数的呢?
任何帮助都是非常感谢的!
ps,(如果这有帮助的话)在我的包目录中,我有一个__init__.py文件告诉python要导入哪些文件
__all__ = [
'pyfile1',
'pyfile2',
'pyfile3',
]发布于 2013-01-07 15:35:07
该目录包含
文件,其中包含函数(def命令)。我所要做的就是让这些函数可用,而不是在导入时直接运行。
def语句是代码,必须运行,否则函数将无法定义。当您导入模块或包时,Python始终运行您的代码。函数、类和全局变量/常量定义都是代码,就像其他任何东西一样。
这些函数不会被调用,除非您编写代码来调用它们。但是如果你确实写了这样的代码,它就会被运行。在def foo(i): print(i)发生时没有特殊的状态,但foo(3)不会;所有代码都会运行。
有时,您希望编写一个模块,该模块可以由其他代码导入,但也可以作为脚本运行。(或者,您可能只想让模块在作为脚本执行时运行其测试。)这就是__main__成语的用武之地。
你把这个习惯用法弄错了--或者更确切地说,你把一个不常见的案例放在了典型案例的前面。通常,您会这样做:
def foo(f):
blahblah(f)
def bar(fname):
with open(fname) as f:
foo(f)
if __name__ == '__main__':
import sys
for arg in sys.argv[1:]:
bar(arg)在导入模块时,将执行foo和bar定义,因此导入的代码可以执行qux.bar(fname),但if语句中的内容不会执行(因为导入的模块是__name__ != '__main__' )。当你将模块作为脚本运行时,这些东西就会被执行(因为__name__ == '__main__')。所以,你可以做./qux.py myfile.txt (或者C:\Python33\Python.exe .\qux.py myfile.txt,或者其他任何东西),它会帮你摆脱myfile.txt。
对于if __name__ == '__main__',您几乎不需要在else块中放置任何内容。
但很少是永远不会的。有时,您需要定义将模块用作模块,但不需要将其作为脚本运行。如果编译这些定义需要很长时间(例如,因为模块预先计算了一个包含100000个元素的dict以加快以后的访问速度),那么您不希望在每次运行脚本时都这样做。因此,这些定义将进入else块。
https://stackoverflow.com/questions/14191637
复制相似问题