【问题标题】:How to find which file was the "initiator" Python如何找到哪个文件是“发起者”Python
【发布时间】:2018-07-04 11:05:18
【问题描述】:

情况:我们知道下面会检查脚本是否被直接调用。

if __name__ == '__main__':
    print "Called directly"

else:
    print "Imported by other python files"

问题:else 子句只是一个通用子句,只要不直接调用脚本就会运行。

问:如果不直接调用,有什么办法可以得到导入到哪个文件?

附加信息:下面是我设想的代码示例,只是我不知道在<something> 中输入什么。

if __name__ == '__main__':
    print "Called directly"

elif <something> == "fileA.py":
    print "Called from fileA.py"

elif <something> == "fileB.py":
    print "Called from fileB.py"

else:
    print "Called from other files"

【问题讨论】:

  • 调用文件名需要什么?
  • 我不确定您是否真的想这样做。有一个依赖原则,依赖的东西不应该知道或关心依赖它的东西。在 Python 中,像许多语言一样,可以有许多其他模块导入此模块。因此,您的&lt;something&gt; 实际上将包含不同的东西在快速的继承中。
  • @mrCarnivore 我可能需要代码来运行不同的东西,这取决于调用它的文件。
  • @TimothyWong 你不想这样做。通常,函数或模块不会根据调用它的内容而改变其行为。尝试传递由函数或模块处理的参数。
  • 对使用全局变量的常见警告是因为它们破坏了模块内的模块化。如果没有全局变量,您只需要分别了解每个函数,但使用全局变量,您需要了解所有函数如何通过全局变量“泄漏”相互影响。但是你提出的更糟糕的是:它破坏了整个程序的模块化,所以你不能简单地单独理解每个模块,你需要看看它们是如何相互影响的。因此,您甚至不必费心创建单独的模块,只需将其编写成一大堆难以阅读的意大利面条代码即可。 ;)

标签: python python-import filereference


【解决方案1】:

试试这个:-

import sys
print sys.modules['__main__'].__file__

请参考:-How to get filename of the __main__ module in Python?

【讨论】:

  • 这行得通,但是您是否碰巧知道不需要导入模块sys 的方法?我正在使用的 SBC 显然有一个有问题的 sys 模块,我一直没有处理它......
  • 不,我不知道没有“sys”模块的解决方案,我会保留这个答案以帮助谁可以使用“sys”模块。
  • 哇...确定!非常感谢——如果没有sys 模块没有人能做到,我会接受它作为答案。
  • 找到了我的答案。您介意将此链接放入您的答案+ cmets 中提到的注意事项吗?更改后我会接受它作为答案。 stackoverflow.com/questions/606561/…
【解决方案2】:

根据您要完成的任务,您可能需要了解几种不同的方法。

inspect 模块有一个getfile() 函数,可用于确定当前执行函数的名称。

例子:

#!/usr/bin/env python3
import inspect
print(inspect.getfile(inspect.currentframe()))

结果:

test.py

要找出用于执行脚本的命令行参数,您需要使用sys.argv

例子:

#!/usr/bin/env python3
import sys
print(sys.argv)

使用./test.py a b c 调用时的结果:

['./test.py', 'a', 'b', 'c']

使用python3 test.py a b c 调用时的结果:

['test.py', 'a', 'b', 'c']

希望这会有所帮助!

【讨论】:

  • 这并不能回答问题,但无论如何感谢 - 将来它可能会派上用场哈哈哈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 2016-02-02
  • 2020-02-14
  • 2017-10-11
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多