确定代码是 运行 本地还是部署到 PythonAnywhere 的可靠方法是什么?

What is a reliable way to determine if code is run locally or deployed to PythonAnywhere?

我遇到过几种方法,但不知道哪一种是最可靠或经过验证的 PythonAnywhere 方法。

一些环境提供了一个环境变量,比如

os.getenv('WHEREAMI') # some cluster

os.getenv('DYNO') # Heroku

Azure 似乎使用类似

的东西
RoleEnvironment.IsAvailable

在 PythonAnywhere 上,我看到用户名

USERNAME=my_pythonanywhere_username

可以使用。或者像

subprocess.run(['hostname'])

哪个returns什么的,但我不确定这是否可靠。

还有其他方法吗?什么是一个好的选择?

这里是 PythonAnywhere 开发者 -- 这是一个很好的问题。检查您的用户名是一个很好的解决方案,但如果(例如)您的 PythonAnywhere 用户名与您在自己机器上使用的用户名相同,这当然并不理想。

如果您不使用 SSH 连接到我们的服务器,那么一个很好的替代解决方案是查看 PYTHONANYWHERE_SITE 环境变量。这将始终设置为 www.pythonanywhere.comeu.pythonanywhere.com,具体取决于您访问的是我们位于美国的网站还是位于欧盟的网站。但是,当您通过 SSH 登录时,它不会被设置。

你确实也可以看看主机名。 socket.gethostname() 可能比使用 subprocess 更快捷。您返回的主机名会随着时间的推移而变化,具体取决于您的代码所在的位置 运行ning,但它会遵循一个通用的模式。例如,如果您现在在美国 PythonAnywhere 的控制台中 运行 该代码,您将得到类似 blue-liveconsole3 的内容,而如果您从网站代码 运行 它你会得到类似 blue-liveweb20 的东西。在我们的下一次系统更新后,这些可能会更改为 green-liveconsole3green-liveweb20。通常,模式是 greenblue,然后是 -,然后是 live(对于我们美国系统上的代码 运行ning)或 eu(欧盟的代码 运行ning),然后是代码 运行ning 所在的服务器类型,然后是一个数字。