Python,使用其他 .py 文件中函数的全局变量/NameError
Python, Use global var from function in other .py file / NameError
get_asset_type_v001.py
import re
def get_asset_type(filename):
"""Check filename for asset type"""
global is_vfx_file, is_edit_file, proj_yy, client, show, edit_version, edit_stage, tv, pv, date, seq_nr, seq_name, shot_nr, shot_name
is_vfx_file = False
is_edit_file = False
if re.match(edit_pattern, filename): # Check if file is a edit prev
print("\nFile is an Edit prev. Filename: {}".format(filename))
proj_yy, client, show, edit_version, edit_stage, tv, pv, date, *_ = filename.split("_")
is_edit_file = True
if re.match(vfx_pattern, filename): # Check if file is a VFX prev
print("\nFile is a VFX prev. Filename: {}".format(filename))
seq_nr, seq_name, shot_nr, shot_name, *_ = filename.split("_")
is_vfx_file = True
# get_asset_type(sample_vfx_filename) # Call function to return is vfx file and print result
# print(is_vfx_file) # Check if it's a vfx file
在同一个文件中打印函数非常有效。
print('_'.join(list((seq_nr, seq_name, shot_nr, shot_name))))
main_programm_file_v001.py
from get_asset_type_v001 import * # Import function ti check what asset type it is
filename = sample_vfx_filename
get_asset_type(filename) # Code workes fine till this line
print('_'.join(list((seq_nr, seq_name, shot_nr, shot_name)))) # The variables in this line "seq_nr..." are making the problem
但是尝试在另一个文件中使用导入函数的代码会引发以下错误。好像我无法访问全局变量。
NameError: 名称 'seq_nr' 未定义
我会将该函数重新定义为 return 一个值,其中包含有关传递的文件名类型的元数据。一个例子:
import re
def get_asset_type(filename):
"""Check filename for asset type"""
if re.match(edit_pattern, filename):
print("\nFile is an Edit prev. Filename: {}".format(filename))
fields = filename.split("_")
return {'type': 'edit',
'proj_yy': fields[0],
'client': fields[1],
...}
if re.match(vfx_pattern, filename): # Check if file is a VFX prev
print("\nFile is a VFX prev. Filename: {}".format(filename))
fields = filename.split("_")
return {'type': 'vfx',
'seq_nr': fields[0],
'seq_name': fields[1],
...}
很可能您的正则表达式可以使用捕获组来定义,以避免随后拆分文件名的需要;如果模式匹配,return 值将已经包含相关组件。
然后在你的主程序中:
import get_asset_type_v001
filename = sample_vfx_filename
result = get_asset_type_v001.get_asset_type(filename)
if result['type'] == 'vfx':
print('_'.join([result['seq_nr'], result['seq_name'], ...]))
带有捕获组的选项:
def get_asset_type(filename): # V003
"""Check filename for asset type"""
n = re.match(edit_pattern, filename)
if n: # Check if file is a edit prev
print("\nFile is an Edit prev. Filename: {}".format(filename))
fields = filename.split("_")
return {'type': 'edit',
'proj_yy': n.group('proj_yy'),
'client': n.group('client'),
'show': n.group('show'),
'edit_version': n.group('edit_version'),
'edit_stage': n.group('edit_stage'),
'tv': n.group('tv'),
'pv': n.group('pv'),
'date': n.group('date'),
}
m = re.match(vfx_pattern, filename)
if m: # Check if file is a VFX prev
print("\nFile is a VFX prev. Filename: {}".format(filename))
print(m.group('seq_name'))
return {'type': 'vfx',
'seq_nr': m.group('seq_nr'),
'seq_name': m.group('seq_name'),
'shot_nr': m.group('shot_nr'),
'shot_name': m.group('shot_name')
}
get_asset_type_v001.py
import re
def get_asset_type(filename):
"""Check filename for asset type"""
global is_vfx_file, is_edit_file, proj_yy, client, show, edit_version, edit_stage, tv, pv, date, seq_nr, seq_name, shot_nr, shot_name
is_vfx_file = False
is_edit_file = False
if re.match(edit_pattern, filename): # Check if file is a edit prev
print("\nFile is an Edit prev. Filename: {}".format(filename))
proj_yy, client, show, edit_version, edit_stage, tv, pv, date, *_ = filename.split("_")
is_edit_file = True
if re.match(vfx_pattern, filename): # Check if file is a VFX prev
print("\nFile is a VFX prev. Filename: {}".format(filename))
seq_nr, seq_name, shot_nr, shot_name, *_ = filename.split("_")
is_vfx_file = True
# get_asset_type(sample_vfx_filename) # Call function to return is vfx file and print result
# print(is_vfx_file) # Check if it's a vfx file
在同一个文件中打印函数非常有效。
print('_'.join(list((seq_nr, seq_name, shot_nr, shot_name))))
main_programm_file_v001.py
from get_asset_type_v001 import * # Import function ti check what asset type it is
filename = sample_vfx_filename
get_asset_type(filename) # Code workes fine till this line
print('_'.join(list((seq_nr, seq_name, shot_nr, shot_name)))) # The variables in this line "seq_nr..." are making the problem
但是尝试在另一个文件中使用导入函数的代码会引发以下错误。好像我无法访问全局变量。
NameError: 名称 'seq_nr' 未定义
我会将该函数重新定义为 return 一个值,其中包含有关传递的文件名类型的元数据。一个例子:
import re
def get_asset_type(filename):
"""Check filename for asset type"""
if re.match(edit_pattern, filename):
print("\nFile is an Edit prev. Filename: {}".format(filename))
fields = filename.split("_")
return {'type': 'edit',
'proj_yy': fields[0],
'client': fields[1],
...}
if re.match(vfx_pattern, filename): # Check if file is a VFX prev
print("\nFile is a VFX prev. Filename: {}".format(filename))
fields = filename.split("_")
return {'type': 'vfx',
'seq_nr': fields[0],
'seq_name': fields[1],
...}
很可能您的正则表达式可以使用捕获组来定义,以避免随后拆分文件名的需要;如果模式匹配,return 值将已经包含相关组件。
然后在你的主程序中:
import get_asset_type_v001
filename = sample_vfx_filename
result = get_asset_type_v001.get_asset_type(filename)
if result['type'] == 'vfx':
print('_'.join([result['seq_nr'], result['seq_name'], ...]))
带有捕获组的选项:
def get_asset_type(filename): # V003
"""Check filename for asset type"""
n = re.match(edit_pattern, filename)
if n: # Check if file is a edit prev
print("\nFile is an Edit prev. Filename: {}".format(filename))
fields = filename.split("_")
return {'type': 'edit',
'proj_yy': n.group('proj_yy'),
'client': n.group('client'),
'show': n.group('show'),
'edit_version': n.group('edit_version'),
'edit_stage': n.group('edit_stage'),
'tv': n.group('tv'),
'pv': n.group('pv'),
'date': n.group('date'),
}
m = re.match(vfx_pattern, filename)
if m: # Check if file is a VFX prev
print("\nFile is a VFX prev. Filename: {}".format(filename))
print(m.group('seq_name'))
return {'type': 'vfx',
'seq_nr': m.group('seq_nr'),
'seq_name': m.group('seq_name'),
'shot_nr': m.group('shot_nr'),
'shot_name': m.group('shot_name')
}