用户输入“sudo python helper.py”来运行我的文件。我希望程序创建一个别名,以便用户只需键入“helper”。因此,当 python 脚本运行时,我让它创建一个别名(在检查别名是否已存在之后)。
lStr= 'alias helper=\'sudo python "'+os.path.abspath(__file__)+'"\''
print lStr
subprocess.Popen(lStr,shell=True)
但是当程序退出时,别名仍然不存在,我不知道为什么。如果我手动将 print 语句的结果复制到 bash 中,那么别名就会正确创建。但是,当从 python 程序中调用它时,它不起作用。有什么想法吗?
<小时/>因为我的程序有大量的交互,所以我无法使用 Use python to dynamically create bash aliases 给出的答案(eval "$(python ...)"
),因为这将捕获菜单文本和用户交互中涉及的其他内容。
我可以(并且确实)更新 ~/.bash_aliases
,这样用户在下次打开 shell 时就已经获得了新的别名——但是有没有办法即使在程序与用户交互?
最佳答案
当您使用子进程
时,您就是在这样做,打开另一个进程来运行目标命令。
问题在于您正在创建一个新的 shell 环境,设置别名,然后立即退出新的 shell,从而丢失配置。
您可以做的是让 Python 进程简单地打印要评估的命令,然后使用 eval
将它们加载到您当前的环境中。
Python:
lStr= 'alias helper=\'sudo python "'+os.path.abspath(__file__)+'"\''
print lStr
Bash,评估输出,并在当前上下文中运行别名命令。
eval "$( python ./myScript )"
然后
alias helper
alias helper='sudo python "/Users/xyz/test.py"'
关于python - 当程序写入菜单/打印日志时,使用 python 在父 shell 中创建 bash 别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43902607/