【问题标题】:Writing a Python script to execute with a console command编写 Python 脚本以使用控制台命令执行
【发布时间】:2013-05-13 00:40:41
【问题描述】:

研究在底部,在-1'ing之前阅读...谢谢。

我必须编写一个运行 SQL 查询的 Python 脚本。我做了一个主类并调用 SQLQuery。每个 SQLQuery 实例代表一个查询。脚本的结构必须如下:

class SQLQuery(object):

     def __init___(self, string_myQuery)...

instance1 = SQLQuery(SQLQuery1)...

instance2 = SQLQuery(SQLQuery2)...

作为用户要求,实例必须与类在同一个文件中(所以我不能只将每个实例设为主文件并单独执行该文件),并且每个实例 必须使用 Linux 控制台命令执行。我可以使用简单的 python SQLQuery.py 执行整个脚本,但我需要分别执行每个实例。查询将每天自动执行,因此我不需要终端 UI 树。它应该使用类似这样的命令来执行:

python SQLQuery.py -inst1

将执行instance1。

python SQLQuery.py -inst2

将执行instance2。

我研究了如何使用 Linux 命令执行 Python 脚本,大部分文章都是关于从 Python 脚本调用命令的。但是,我从 Python 文档中找到了this article。它建议添加 -m,所以:

python SQLQuery.py -m inst1

这可以让我使用控制台命令设置我的 main,但它不起作用,因为实例不是模块。而且由于实例必须与类在同一个文件中,所以当我使用控制台命令执行 SQLQuery.py 时,我不能将它们作为模块导入。

【问题讨论】:

  • 为什么不直接向脚本传递一个命令行参数,告诉它运行哪个实例?
  • 您提出的结构毫无意义。 SQLQuery 将自己作为基类,并将自己作为 __init__ 参数?另外,MainClassSQLQuery1 是什么?
  • 另外,该文档建议在哪里添加-m?它描述了-m 如何作为python 本身的参数工作,这意味着按名称查找和执行模块;这并不意味着 -m 应该作为脚本参数的任何含义。
  • 签出docs.python.org/2/library/argparse.html,构建命令行界面
  • martineau,这就是我想要做的。你已经描述了我的问题。 abarnert,这无关紧要。

标签: python linux command-line scripting command-line-arguments


【解决方案1】:

忽略所有无关紧要的事情,听起来你的问题是你有一堆名为instance1instance2instance3 等的全局对象,并且你想基于其中一个调用一些方法在命令行参数上,其值将与实例名称相似但不完全相同。

这可能不是一个好主意……但也没那么难:

if __name__ == '__main__':
    inst = sys.argv[1] # will be 'inst1', 'inst13', etc.
    inst_number = inst[5:] # so '1', '13', etc.
    inst_name = 'instance' + inst_number
    instance = globals()[inst_name]
    instance.execute()

做同样事情的更好方法是将 instance 全局变量放入可以索引的列表或字典中。

例如,假设你有一个 instances 字典,而不是 instance1instance2 等,还有 instances['1']instances[2] 等。现在代替这个:

inst_name = 'instance' + inst_number
instance = globals()[inst_name]
instance.execute()

……你只需这样做:

instances[inst_number].execute()

另外,与其想出一个命令行参数,其中包含额外的东西,你必须解析和丢弃,而且对人类读者来说没有比对你的代码更有意义的东西,为什么不只取一个数字?

python myscript.py 12

或者,或者,使用argparse 创建一个可以以所有明显方式使用的参数:

python myscript.py --instance=12
python myscript.py --instance 12
python myscript.py -i12
python myscript.py -i 12

无论哪种方式,您的代码都会获取字符串'12',然后可以使用该字符串来查找函数,如上所述。

【讨论】:

  • 谢谢,如果我有更多的代表,我会支持它。其他人只是挑选了不相关的内容并给我投了反对票,因为他们在帖子底部找不到我所做的研究。我想下次我会把我的研究放在首位。我将尝试将实例放入字典中。这似乎是最简单、最干净的解决方案,而且它不必是人类可读的,因为该命令将由服务器每天按计时器运行。
  • @JaneGoodall:作为提问者,接受正确答案——或者评论最好的答案以解释如何在值得接受之前加以改进——比投票更重要。
【解决方案2】:

-m 选项的语法有误。假设您有以下名为foo.py 的文件:

import sys
print 'First arg is: ', sys.argv[1]

那么你可以这样称呼它:

$ python -m foo bar
First arg is:  bar

请注意,“.py”扩展名被省略。然后,您可以使用命令行参数来决定使用哪个对象或使用argparseoptparse 模块来处理参数。

【讨论】:

  • 谢谢 bogatron,但我无法调用外部文件。这是用户的要求。
  • 也许我不明白你的问题。我不建议您调用外部文件。上面的foo.py 文件是您的SQLQuery.py 文件。您使用命令行参数来决定在文件中使用哪个对象。如果您尝试通过命令行调用在现有 python 进程中创建新对象,那么您应该考虑使用 python multiprocessing 模块,这将使您能够轻松设置可以从命令行访问的服务器进程在模块中创建新对象。
猜你喜欢
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
  • 2022-06-18
  • 2021-09-13
相关资源
最近更新 更多