我需要将局部变量从一个python
文件提供给另一个,将变量组合在一起然后将其他变量放回到第一个文件中。
我查看了cyclic dependency
和combining local and global variables
的SO讨论,但它似乎无法解决我的问题。
这是我想要完成的例子
几个python
脚本生成报告。
#report1.py
report_name = "daily_report1"
#report2.py
report_name = "daily_report2"
report_name
是报告名称的变量,需要在mysettings.py
中提供,其中包含大多数环境变量和常量。
#mysettings.py
save_location= os.getcwd()+ "\\" + report_name + "\\"
report_file = report_name + "_" + \
str(datetime.datetime.today().strftime('%m_%d_%Y')) + ".xlsx"
然后,代码会查询服务器并获取csv
文件并转换为xlsx
并根据需要进行修改。
回到报告?.py
#report1.py
import mysettings.py
report_name = "daily_report1"
wb = openpyxl.load_workbook(report_file)
#Lots of other code
wb.save(save_location + report_file)
#report2.py
import mysettings.py
report_name = "daily_report2"
wb = openpyxl.load_workbook(report_file)
#Lots of other code
wb.save(save_location + report_file)
挑战是,如何将report_name
提供给mysettings.py
,然后在report1.py和report2.py
一旦工作,将会添加其他报告,因此我希望简化变量/设置。
我还想在所有reports?.py
中声明尽可能少的变量,而是在mysettings.py
感谢任何想法。
答案 0 :(得分:3)
您应该在mysettings.py中定义一个函数,并在其他文件中执行:
#mysettings.py
def getsettings(report_name):
save_location= os.getcwd()+ "\\" + report_name + "\\"
report_file = report_name + "_" + \
str(datetime.datetime.today().strftime('%m_%d_%Y')) + ".xlsx"
return save_location, report_file
#report1.py
import mysettings.py
report_name = "daily_report1"
save_location, report_file = mysettings.getsettings(report_name)
wb = openpyxl.load_workbook(report_file)
#Lots of other code
wb.save(save_location + report_file)
这样您就不需要在不同的脚本中使用全局变量
答案 1 :(得分:0)
好的,最直接的方法是在报告模块中执行mysettings.py
中的代码:
report_name = "blah"
with open("mysettings.py","r") as common_code:
exec(f.read(), globals()) #the globals() is actually implied if there is no second argument
print(report_file)
但是,在模块之间传递多个变量通常由environment
字典处理,因此您可以让mysettings.py
具有如下函数:
def generate_report_file(environ):
report_name = environ["report_name"]
environ["save_location"] = os.getcwd()+ "\\" + report_name + "\\"
environ["report_file"] = report_name + "_" + \
str(datetime.datetime.today().strftime('%m_%d_%Y')) + ".xlsx"
然后在报告文件中,您可以手动处理环境:
environ = {}
environ["report_name"] = "blah"
mysettings.generate_report_file(environ)
print(environ["report_file"])
或者利用全局命名空间跟踪词典的事实:
report_name = "blah"
mysettings.generate_report_file(globals())
print(report_file)