检查模块中 运行 脚本文件的名称
Check name of running script file in module
我有 2 个导入相同模块的应用程序文件:
#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
。
这对我有用。
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')
我不确定进口商是否有可能知道是谁进口的。即使是,对我来说也像是代码的味道。
相反,您可以将决定由 app1
和 app2
决定,而不是让 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
作为编程习惯,因此请尽可能少地使用它们。
我认为您当前的方法不是解决问题的最佳方法。您也可以通过稍微修改 settings.py
来解决这个问题。您有两种可能的方法:coldspeed 解决方案或使用委托。无论哪种方式,您都必须将模块的代码存储在函数中。
解决此问题的另一种方法是(取决于取决于应用程序名称的代码行数)将 function/delegate 作为参数传递给函数,如下所示:
#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
解决方案相比,这似乎是一个更简洁的解决方案,因为它可以更好地分离两个模块。
选择第一个版本还是第二个版本,很大程度上取决于应用范围;也许您可以向我们提供有关您试图解决的更广泛问题的更多信息。
正如其他人所说,也许这不是实现它的最佳方法。如果你确实想要,使用 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
当然,这会为您提供最初来自命令行的 运行 文件,因此,如果这是进一步嵌套导入集的一部分,这对您不起作用。
我有 2 个导入相同模块的应用程序文件:
#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
。
这对我有用。
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')
我不确定进口商是否有可能知道是谁进口的。即使是,对我来说也像是代码的味道。
相反,您可以将决定由 app1
和 app2
决定,而不是让 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
作为编程习惯,因此请尽可能少地使用它们。
我认为您当前的方法不是解决问题的最佳方法。您也可以通过稍微修改 settings.py
来解决这个问题。您有两种可能的方法:coldspeed 解决方案或使用委托。无论哪种方式,您都必须将模块的代码存储在函数中。
解决此问题的另一种方法是(取决于取决于应用程序名称的代码行数)将 function/delegate 作为参数传递给函数,如下所示:
#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
解决方案相比,这似乎是一个更简洁的解决方案,因为它可以更好地分离两个模块。
选择第一个版本还是第二个版本,很大程度上取决于应用范围;也许您可以向我们提供有关您试图解决的更广泛问题的更多信息。
正如其他人所说,也许这不是实现它的最佳方法。如果你确实想要,使用 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
当然,这会为您提供最初来自命令行的 运行 文件,因此,如果这是进一步嵌套导入集的一部分,这对您不起作用。