在Python脚本中使用输入变量

时间:2015-10-11 22:44:35

标签: python python-3.x

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

我已尝试过不同的方法来执行此操作,例如在主脚本中将变量的初始值设置为None,但我遇到的问题是当我将script1导入script2时,它会运行脚本并再次将有问题的变量重置为None。另外,我试图将它们包装在一个没有运气的课堂中。

另外,我尝试使用if __name__ = '__main__':来运行这些函数,但我似乎无法弄清楚如何将这些函数中的值输出到script2中以用作全局变量。

我在这里看到了一些可能有用的答案,例如将函数的值返回给另一个函数使用??但是我不能完全确定语法,因为函数没有似乎保留了变量的值。

如果我错误地提出了这个问题,请告诉我如何改进它,因为我试图提出问题"好"问题所以我不会被禁止。我还在学习,我确实在这里提出了很多问题,但是我通过这样做了解了很多。

script1.py:

#! /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())

script2.py

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()

2 个答案:

答案 0 :(得分:2)

这是一个我认为是常见做法的解决方案。设置一个名为 global_var.py 的文件(或类似名称)并在那里存储全局变量。 (See this post by @systemizer)以下是适用于您的代码的简化版本:

script1.py

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)>'

script2.py

from script1 import gh
from global_var import user
print user
print gh

答案 1 :(得分:1)

这个答案完全基于我的假设,即您只想获取一次用户凭据,并希望重新使用它&#34; n&#34;其他脚本中的次数。 我就是这样做的,

UPDATE1

您的问题还与组织和运行脚本的方式有关,如果您将脚本捆绑到python包并运行它们,下面的示例就可以使用

有关。例如

enter image description here

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

SCRIPT1

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]

在其他脚本中

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

from script1 import do_login
creds = do_login()  

脚本4

from script3 import creds
from script1 import do_login
print creds
print do_login() # No input prompt would be provided