2016-02-25 72 views
0

我使用PyDrive从桌面Python应用程序,我用Pyinstaller打包上传文件到GoogleDrive。我想尽可能隐藏client_secrets.json,因此我使用此解决方案将其嵌入到Pyinstaller .exe文件中:Bundling Data files with PyInstaller 2.1 and MEIPASS error --onefilePyDrive client_secrets从其他目录

但是,PyDrive没有从temp目录中找到client_secrets文件,其中Pyinstaller放置数据文件。

如何让PyDrive从另一个目录读取json文件,特别是AppData?我正在考虑将文件从临时目录移动到工作目录,然后进行身份验证和删除(如果在之后),但某些用户没有管理员访问权限并且无法修改程序文件(安装应用程序的位置)

I请参阅我可以使用可以引用其他目录的settings.yaml文件,但pyinstaller似乎使用sys._MEIPASS变量将嵌入式client_secrets.json放置在临时文件夹中,所以我不知道它会在哪里。

我将不得不直接向GoogleAuth()传递有价值的信息,有没有办法做到这一点?

回答

1

真的不是最好的解决办法,但我只是修改我自己的Pydrive auth.py文件做...

我加入这个方法用于我曾经在我的约MEIPASS代码添加的伎俩:

def resource_path(self,relative_path): 
     """ Get absolute path to resource, works for dev and for PyInstaller """ 
     try: 
      # PyInstaller creates a temp folder and stores path in _MEIPASS 
      base_path = sys._MEIPASS 
     except Exception: 
      base_path = os.path.abspath(".") 
     return os.path.join(base_path, relative_path) 

和修改这些方法:

加载证书文件的方法:(我不在乎被它出现,但你当然可以不将其设置为我的)

def LoadCredentialsFile(self, credentials_file=None): 
    """Loads credentials or create empty credentials if it doesn't exist. 

    Loads credentials file from path in settings if not specified. 

    :param credentials_file: path of credentials file to read. 
    :type credentials_file: str. 
    :raises: InvalidConfigError, InvalidCredentialsError 
    """ 
    if credentials_file is None: 
     credentials_file = self.settings.get('save_credentials_file') 
     if credentials_file is None: 
     raise InvalidConfigError('Please specify credentials file to read') 
    try: 
     storage = Storage(self.resource_path(credentials_file)) 
     self.credentials = storage.get() 
    except CredentialsFileSymbolicLinkError: 
     raise InvalidCredentialsError('Credentials file cannot be symbolic link') 

加载client.secrets的方法:

def LoadClientConfigFile(self, client_config_file=None): 
    """Loads client configuration file downloaded from APIs console. 

    Loads client config file from path in settings if not specified. 

    :param client_config_file: path of client config file to read. 
    :type client_config_file: str. 
    :raises: InvalidConfigError 
    """ 
    if client_config_file is None: 
     client_config_file = self.settings['client_config_file'] 
    try: 
     client_type, client_info = clientsecrets.loadfile(self.resource_path(client_config_file)) 
...method continue here... 

而且init方法:

def __init__(self, settings_file='settings.yaml',http_timeout=None): 
    """Create an instance of GoogleAuth. 

    This constructor just sets the path of settings file. 
    It does not actually read the file. 

    :param settings_file: path of settings file. 'settings.yaml' by default. 
    :type settings_file: str. 
    """ 
    self.http_timeout=http_timeout 
    ApiAttributeMixin.__init__(self) 
    self.client_config = {} 
    try: 
     self.settings = LoadSettingsFile(self.resource_path(settings_file)) 
    except SettingsError: 
     self.settings = self.DEFAULT_SETTINGS 
    else: 
     if self.settings is None: 
     self.settings = self.DEFAULT_SETTINGS 
     else: 
     ValidateSettings(self.settings) 

我知道这可能不是做的很好的方式:)但是,如果有人知道更好的办法,但它的作品...

因此,如果有人有一个更好的解决方案,请让我知道:)

1

更简单的解决方案:

from pydrive.auth import GoogleAuth 
GoogleAuth.DEFAULT_SETTINGS['client_config_file'] = path_to_secrets_file