A resposta de @ Paul92 é uma boa discussão geral, mas eu gostaria de oferecer uma possível solução limpa (ish) para isso:
Como uma biblioteca, esse código precisa ser adaptável a qualquer ambiente de tempo de execução; portanto, você não pode realmente solicitar STDIN
alguns dados cruciais. Por um lado, os usuários da sua biblioteca podem não ter o stdin disponível por vários motivos. Em vez disso, convém usar alguma forma de padrão de estratégia para personalizar como o token deve ser recuperado.
No Python, provavelmente a melhor opção é passar a estratégia de busca de token como um parâmetro de função. Algo parecido:
def stdin_prompt():
return input("Enter code: ")
def my_library_function(arg1, arg2, ... argn, token_provider = stdin_prompt):
...
token = token_provider()
...
return stuff
# somewhere in the user code
stuff = my_library_function(a1, a2, ... an, lambda: "123456")
Pense nisso assim. O token que você precisa é um argumento para a função de biblioteca. Como o valor do token pode não ser conhecido estaticamente no site da chamada, você não pode realmente solicitar o valor como argumento. Em vez disso, o chamador deve fornecer uma função que será responsável por fornecer o token quando chamado.
Toda a responsabilidade de fornecer a mecânica exata do token agora é externalizada a partir da função de biblioteca. O consumidor da função agora é responsável por adquirir o token por quaisquer meios disponíveis em tempo de execução. Pode perguntar ao STDIN, mas também pode funcionar como um gateway de email, aguardar a mensagem aparecer na caixa de entrada, ler, extrair o token e automatizar completamente o processo. Pode ser um diálogo da GUI ou um formulário baseado na Web. Qualquer coisa realmente - todas as opções estão agora nas mãos do consumidor da biblioteca.