检查模块中运行脚本文件的名称

时间:2017-09-06 08:44:22

标签: python module main

我有两个导入相同模块的app文件:

#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')

我检查模块inspect,但不知道。

此外,我愿意接受所有更好的解决方案。

编辑:我觉得有点愚蠢(我想这很容易)

我试试:

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

print (var)

但仍然是None

4 个答案:

答案 0 :(得分: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一般不建议作为编程实践,因此请尽可能少地使用它们。

答案 1 :(得分:1)

我认为您当前的方法不是解决问题的最佳方法。你也可以通过稍微修改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解决方案相比,这看起来更清晰,因为它可以更好地分离两个模块。

它在很大程度上取决于应用范围,是否应该选择第一个或第二个版本;也许您可以向我们提供有关您正试图解决的更广泛问题的更多信息。

答案 2 :(得分:1)

正如其他人所说,也许这不是实现它的最佳方式。但是,如果你想这样做,那么如何使用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

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

答案 3 :(得分:0)

这适合我。

import inspect
import os

curframe = inspect.currentframe()
calframe = inspect.getouterframes(curframe, 1)

if os.path.basename(calframe[1][1]) == 'app1.py':
   print ('app1')
else:
   print ('app2')