回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个模块:<code>generate_ruml</code>,它有一个全局变量<code>foo</code>。当我运行脚本<code>python3 generate_ruml.py</code>时,它可以工作</p>
<p>但是,当我使用<code>python3 gruml_cli.py</code>从另一个模块<code>gruml_cli</code>调用<code>generate_ruml</code>(函数名为:<code>gruml()</code>)的函数时,全局变量不会被访问,并且在使用<a href="https://docs.python.org/3/library/trace.html" rel="nofollow noreferrer">Trace</a>时被视为<code>None</code></p>
<p>我如何使行<code>global foo</code>工作</p>
<p>下面是<code>generate_ruml</code>的代码:</p>
<pre><code>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()
</code></pre>
<p>下面是<code>gruml_cli</code>的代码:</p>
<pre><code>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)
</code></pre>
<p>这是我从<code>gruml_cli</code>调用函数时收到的错误:</p>
<pre class="lang-none prettyprint-override"><code>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
</code></pre>
<p>我还试图在<code>sys</code>路径中插入脚本<code>generate_ruml.py</code>,但没有成功</p>