Use input variables across Python scripts
我试图在另一个python脚本中执行操作后访问函数中包含的变量,但我不想运行函数的操作,我只需要访问变量
我尝试过不同的方法来实现这一点,比如在主脚本中将变量的初始值设置为"无",但我遇到的问题是,当我将script1导入script2时,它会在脚本中运行,并再次将有问题的变量重置为"无"。另外,我还试着把它们包装在一个没有运气的班级里。
此外,我还尝试使用
我在这里看到了一些可能有效的答案,比如将函数的值返回到另一个函数以供使用?但是我不能很准确地理解语法,因为函数似乎不包含变量的值。
如果我错误地问了这个问题,请告诉我如何改进它,因为我试图问"好"的问题,所以我不会被禁止。我还在学习,我在这里问了很多问题,但我通过这样做学到了很多。
脚本1.PY:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #! /usr/bin/python import github3 from github3 import login, GitHub, authorize from getpass import getuser, getpass import requests import configparser def getCreds(): try: user = input('GitHub username: ') except KeyboardInterrupt: user = getuser() password = getpass('GitHub token for {0}: '.format(user)) gh = login(user, password) if __name__ == '__main__': getCreds() exec(open("next_file.py").read()) |
脚本2.Py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | import os import github3 from github3 import login, GitHub, authorize from getpass import getuser, getpass import requests import csv import configparser import sys import script1 import codecs gh = script1.gh user = script1.user def one_commit_one_file_change_pr(): #open csv file and create header rows with open('c:\\commit_filechange.csv', 'w+') as f: csv_writer = csv.writer(f) csv_writer.writerow(['Login', 'Title', 'Commits', 'Changed Files','Deletions', 'Additions']) for pr in result: data = pr.as_dict() changes = (gh.repository(user, repo).pull_request(data['number'])).as_dict() if changes['commits'] == 1 and changes['changed_files'] == 1: #keep print to console statement for testing purposes #print changes['user']['login'] with open('c:\\commit_filechange.csv', 'a+') as f: csv_writer = csv.writer(f) csv_writer.writerow([changes['user']['login'], changes['title'], changes['commits'], changes['changed_files']]) one_commit_one_file_change_pr() |
这是一个我认为是惯例的解决方案。设置一个名为global_var.py(或类似的文件)的文件,并在其中存储全局变量。(请参阅@systemizer的这篇文章)这里是一个简化版的代码:
脚本1.Py
1 2 3 4 5 6 | if __name__=='__main__': user = raw_input('GitHub username: ') with open('global_var.py','w') as f: f.write("user = '%s'" % user) password = 'blah' gh = '<login(user, password)>' |
脚本2.Py
1 2 3 4 | from script1 import gh from global_var import user print user print gh |
这个答案完全基于我的假设,即您只希望获得一次用户凭证,并且希望在以后的其他脚本中"n"次重复使用它。以下是我的方法,
更新1
您的问题还与您希望如何组织和运行脚本有关,如果您已将脚本捆绑到python包中并运行它们,下面的示例将起作用。
为了。如
但是,如果计划单独运行各个脚本,那么除了调用每个脚本的登录提示之外,没有其他选项,除非计划完全删除请求用户凭据并使用文件中预先配置的数据。
脚本1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | from github3 import login USER_CREDS = None # Store raw input credentials here ,not recomended GIT_USERS = {} # global dict to store multiple users with username as key def getCredentials(): global USER_CREDS if USER_CREDS: print"returning user credentials" return USER_CREDS print"gettting user credentials" user = raw_input("Enter Username") pwd = raw_input("Enter Password") USER_CREDS = (user, pwd) return USER_CREDS def do_login(): global GIT_USERS user, pwd = getCredentials() if not GIT_USERS.get(user, None): gh = login(user, password=pwd) GIT_USERS[user] = gh return GIT_USERS[user] |
在其他脚本中
1 2 3 4 5 6 | from script1 import do_login # the first time do_login() is called it asks for user credentials print do_login() # the next times it just returns the previously collected one print do_login() |
例2
脚本3
1 2 | from script1 import do_login creds = do_login() |
脚本4
1 2 3 4 | from script3 import creds from script1 import do_login print creds print do_login() # No input prompt would be provided |