【问题标题】:How to know if script was run from django or from cli如何知道脚本是从 django 还是从 cli 运行的
【发布时间】:2017-04-06 10:09:59
【问题描述】:

我有 config.py 可以从 cli python 脚本和 Django view.py 导入

如何知道在 config.py - 什么进程导入它? Django中可能有一些特殊的变量吗?

我试过了

if sys.stdin.isatty():
    ***

但它似乎没有做我预期的事情。

我不能用

if __name__ == '__main__':

因为 config.py 是在 cli 中导入到主文件中的。

如果是 Cli,我需要使用 argparse 解析命令行参数。 如果是 Django,我需要导入预定义的 django-config.py

【问题讨论】:

  • 您要解决的真正根本问题是什么?如果您解释最初的需求,而不是询问如何让您的感知解决方案发挥作用,那么也许我们可以提出更好的建议。让一个模块返回并尝试解析命令行参数,绕过它正在使用的程序正在执行的任何参数解析和配置系统,这听起来不是一个好主意。

标签: python django command-line-interface


【解决方案1】:

我会尝试使用 django 设置:

try:
    from django.conf import settings
    x = settings.DATABASES['default']['name'] == 'the name of your default database'
    from_django = True
except ImportError, AttributeError, KeyError:
    from_django = False

【讨论】:

    【解决方案2】:

    我认为最简单的方法是查看sys.argv

    import sys
    
    # sys.argv[0] Should output your script name in a command line environment
    # It should output wsgi.py if you're using wsgi, etc.
    
    if sys.argv[0] == 'manage.py':
       print('called with manage.py, I\'m on the command line!')
    
    elif sys.argv[0] == 'mod_wsgi':
       print('called with with ]mod_wsgi, I\'m run by an HTTP server!')
    
    # In the case where you have something other than Apache with mod_wsgi running your server
    # you'll need to manually determine the contents of sys.argv[0]
    # elif sys.argv[0] == '<your-servers-response-here>':
    #   print('called by your HTTP server!')
    
    else:
       print('called with %s, I don\'t know where that is!' % sys.argv[0])
    

    【讨论】:

    • 取决于您所说的“由 Apache 运行”的含义,但该特定测试不适用于 mod_wsgi,也不适用于我所知道的其他 WSGI 服务器。
    • @GrahamDumpleton 你说的很对。我从另一个已设置的 VirtualHost 复制了它……创造性地(翻译:我不知道我在做什么)。 mod_wsgi 在使用Apache 时位于sys.argv[0]
    • 我对是否在 Apache 下运行 mod_wsgi 的更健壮的测试在modwsgi.readthedocs.io/en/develop/user-guides/…中有描述
    • 如果你想允许更多的模糊匹配,例如允许在当前工作目录中使用./manage.py 运行python 脚本(而不是调用python manage.py),您可以使用if 'manage.py' in sys.argv[0]。比直接字符串比较慢一点点,但更好的用户体验。
    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 2022-01-21
    • 2013-03-07
    • 2016-10-27
    • 1970-01-01
    • 2018-01-02
    • 2016-02-03
    • 1970-01-01
    相关资源
    最近更新 更多