Esta é definitivamente uma questão sudo e GNU/Linux , não é realmente uma questão Python . Quando você executa sudo foo arg1 arg2 , o sistema inicializa primeiro um shell (aquele definido para raiz, não para você) que está sendo executado como root e, em seguida, "executa" foo arg1 arg2 . Não é exatamente o mesmo que fazer login em root e digitar foo arg1 arg2 na linha de comando, mas fechar. Existem executáveis que não permitem que um usuário sudo rode ou faça algumas coisas e algumas variáveis de ambiente adicionais configuradas para você, que você pode ver se você executar sudo env . Você verá algo como:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PS1=%%
PS2=cont>
MAIL=/var/mail/root
LOGNAME=root
USER=root
USERNAME=root
HOME=/root
SHELL=/bin/bash
SUDO_COMMAND=/usr/bin/env
SUDO_USER=my_user
SUDO_USER=spt
SUDO_UID=1000
SUDO_GID=1000
SUDO_COMMAND=/usr/bin/env
E se o shell for bash, o subshell provavelmente lerá o conteúdo de /root/.bashrc se ele existir. Além disso, o my_user bash shell fará expansão de alias no primeiro item (ou seja, o sudo em sudo foo arg1 arg2 ) e não o segundo ( foo ). Portanto, se foo também for um alias, ele não será expandido e, portanto, a subshell em execução como root tentará executar foo como literal e não foo como o alias criado sob my_user . Existem algumas maneiras de "corrigir" seu problema. Um define um alias para sudo com um espaço à direita:
alias='sudo '
Como explicado aqui , isso causará o que vem depois de sodo para ser também alias-expandido antes de enviá-lo para o subshell para ser executado.
Outra opção é editar o arquivo /root/.bashrc ou equivalente e fazer uma das seguintes ações:
- Prefixe o local do python desejado à variável
$PATHusando algo comoexport PATH=/path/to/foo:$PATH - Defina o alias que você quer lá
Ou, você pode fazer algo (levemente) arriscado e preguiçoso, mas altamente eficaz e apenas executar sudo (cd /root && ln -s /home/my_user/.bashrc) e root sempre irão apenas fornecer o arquivo my_user/.bashrc .