如何在模块之间保留全局变量?

问题描述 投票:0回答:2

我有一个模块:generate_ruml,它具有全局变量foo。当我运行脚本python3 generate_ruml.py时,它可以工作。

但是,当我从另一个模块generate_ruml使用gruml()调用gruml_cli的功能(函数名称是python3 gruml_cli.py)时,使用[[ C0]。

我如何使None行起作用?

下面是Trace的代码:

global foo

下面是generate_ruml的代码:

foo = None

class GRUML:
    def generate_sequential_function_calls(self):
        """generate sequential function calls
        for tracing source code and plotting sequence diagram.
        """
        # generating sequence diagram for a use-case
        _ = GenerateSequenceDiagram(
            self.driver_path, self.driver_name, self.source_code_path[0])
        spec = importlib.util.spec_from_file_location(
            self.driver_name, self.driver_path)
        global foo
        foo = self.foo
        foo = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(foo)
        tracer = Trace(countfuncs=1, countcallers=1, timing=1)
        tracer.run('foo.{}()'.format(self.driver_function))

def gruml(source_code_path, **kwargs):
    """driver function of GRUML.
    """
    gruml = GRUML()
    print('Generating RUML for source code at: {}'.format(source_code_path))
    gruml.get_source_code_path_and_modules(source_code_path)
    gruml.get_driver_path_and_driver_name(
        kwargs.get('use_case', None),
        kwargs.get('driver_name', None),
        kwargs.get('driver_path', None),
        kwargs.get('driver_function', None),
    )
    gruml.generate_dependency_data()
    if gruml.use_case:
        gruml.generate_sequential_function_calls()

这是我从gruml_cli调用函数时收到的错误:

from generate_ruml import gruml
def call_generate_ruml(source_code_link, **kwargs):
    """call gruml function, assume that if use_case is given, all other related 
    arguments will be present, so checking for them can be skipped in here.

    Arguments:
        source_code_link {[type]} -- [description]
    """
    source_code_dir = download_source_code(source_code_link)
    gruml(
        source_code_dir,
        **kwargs
    )

call_generate_ruml(source_code_link, use_case=use_case, driver_name=driver_name, driver_path=driver_path, driver_function=driver_function)

[我也试图将脚本gruml_cli插入Traceback (most recent call last): File "gruml-cli.py", line 64, in <module> driver_name=driver_name, driver_path=driver_path, driver_function=driver_function) File "gruml-cli.py", line 36, in call_generate_ruml **kwargs File "/Users/aviralsrivastava/dev/generate_uml/generate_ruml.py", line 249, in gruml gruml.generate_sequential_function_calls() File "/Users/aviralsrivastava/dev/generate_uml/generate_ruml.py", line 212, in generate_sequential_function_calls tracer.run('foo.{}()'.format(self.driver_function)) File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/trace.py", line 441, in run self.runctx(cmd, dict, dict) File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/trace.py", line 450, in runctx exec(cmd, globals, locals) File "<string>", line 1, in <module> NameError: name 'foo' is not defined 路径中,但徒劳。

python python-3.x trace
2个回答
0
投票

看来您也需要导入全局变量。喜欢:

generate_ruml.py

0
投票

您可以将变量导入为

sys

或者您也可以在整个代码中引用该变量。

from generate_ruml import gruml, foo
© www.soinside.com 2019 - 2024. All rights reserved.