跨python脚本使用输入变量

Use input variables across Python scripts

我试图在另一个python脚本中执行操作后访问函数中包含的变量,但我不想运行函数的操作,我只需要访问变量ghuser的返回值。

我尝试过不同的方法来实现这一点,比如在主脚本中将变量的初始值设置为"无",但我遇到的问题是,当我将script1导入script2时,它会在脚本中运行,并再次将有问题的变量重置为"无"。另外,我还试着把它们包装在一个没有运气的班级里。

此外,我还尝试使用if __name__ = '__main__':来运行函数,但我似乎不知道如何将函数中的值转换为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包中并运行它们,下面的示例将起作用。

为了。如

enter image description here

但是,如果计划单独运行各个脚本,那么除了调用每个脚本的登录提示之外,没有其他选项,除非计划完全删除请求用户凭据并使用文件中预先配置的数据。

脚本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