gpt4 book ai didi

python - 为什么导入模块会导致该模块在从站点包调用它时运行,但在本地调用它时却不会运行?

转载 作者:行者123 更新时间:2023-11-30 23:38:47 25 4
gpt4 key购买 nike

我以这种方式使用 distutils 在 python 中制作了一个包:

#! /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 文件。该目录包含包含函数(def 命令)的 python 文件。我想做的就是使函数可供使用,而不是在导入时直接运行。

如果我愿意

cd python2.7/site-packages

然后进行导入,以便它在本地获取 mypackage4,它会在不运行任何内容的情况下导入,这样我就可以以正常方式从 python 命令行访问这些函数。

为什么python似乎在包不在本地目录中时运行函数,但在包在本地目录中时不运行函数?

其次,我读到了关于放置一个

if __name__ == '__main__':
pass
else:
<define functions here>

在我的 .py 文件中使用命令来阻止它们运行,但它肯定不会运行这些函数,那么它是如何知道它们的呢?

非常感谢任何帮助!

ps,(如果这有帮助)在我的包目录中我有一个 __init__.py文件告诉 python 要导入哪些文件

__all__ = [
'pyfile1',
'pyfile2',
'pyfile3',
]

最佳答案

The directory contains python files which contain functions (def commands). All I want to do is make the functions available for use, not to run directly on import.

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)

当您导入模块时,foobar定义将被执行,因此导入代码可以执行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 block 中放置任何内容。

但很少不是从来没有。有时,您需要定义将模块用作模块,但不需要将其作为脚本运行。如果编译这些定义需要很长时间(例如,因为模块预先计算了 100000 个元素的 dict 以加快以后的访问速度),那么您不希望每次运行脚本时都这样做。因此,这些定义将进入 else block 。

关于python - 为什么导入模块会导致该模块在从站点包调用它时运行,但在本地调用它时却不会运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14191637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com