检查modu中正在运行的脚本文件的名称

2024-04-25 07:25:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个应用程序文件导入相同的模块:

#app1.py
import settings as s
another code

#app2.py
import settings as s
another code

我需要在模块内检查是否运行第一个或第二个应用程序:

#settings.py
#pseudocode
if running app1.py:
   print ('app1')
elif:
   print ('app2')

我检查了模块^{},但不知道。你知道吗

同时,我对所有更好的解决方案持开放态度。你知道吗

编辑:我觉得有点傻(我想这很简单)

我试着:

var = None
def foo(a):
    var = a

print (var)

但仍然是None。你知道吗


Tags: 模块文件pyimportnone应用程序settingsvar
3条回答

我不确定进口者是否可能知道是谁进口的。即使是这样,对我来说也像是代码的味道。你知道吗

相反,您可以做的是将app1app2将要采取的行动的决定委托给他人,而不是让settings做出决定。你知道吗

例如:

settings.py

def foo(value):
    if value == 'app1': 
        # do something        
    else:
        # do something else

app1.py

from settings import foo    
foo('app1')

等等。你知道吗


在函数中赋值并使其反映在global变量上。示例:

A.py

var = None

def foo(a):
    global var
    var = a

def print_var():
    print(var)

test.py

import A

A.print_var()
A.foo(123)
A.print_var()

输出:

None
123

注意global一般不推荐作为编程实践,所以尽可能少地使用它们。你知道吗

正如其他人所说,也许这不是实现这一目标的最佳途径。如果您确实想这样做,那么使用sys.argv来标识调用模块如何?你知道吗

应用程序:

import settings as s

设置:

import sys
import os
print sys.argv[0]
# \\path\\to\\app.py
print os.path.split(sys.argv[0])[-1]
# app.py

当然,这会提供最初从命令行运行的文件,因此如果这是进一步嵌套的导入集的一部分,则对您不起作用。你知道吗

我认为你目前的方法不是解决问题的最好方法。您也可以通过稍微修改settings.py来解决这个问题。您有两种可能的方法:要么解决coldspeed,要么使用委托。无论哪种方式,都必须将模块的代码存储在函数中。你知道吗

解决此问题的另一种方法是(取决于依赖于应用程序名称的代码行数)将函数/委托作为如下参数传递给函数:

#settings.py
def theFunction(otherParemters, callback):
    #do something
    callback()

#app1.py
from settings import theFunction
def clb():
    print("called from settings.py")
    #do something app specific here

theFunction(otherParameter, clb)

inspect解决方案相比,这似乎是一个更干净的解决方案,因为它允许更好地分离两个模块。你知道吗

这在很大程度上取决于应用的范围,你是应该选择第一个版本还是第二个版本;也许你可以为我们提供更多关于你试图解决的更广泛问题的信息。你知道吗

相关问题 更多 >