0

研究在底部,在-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 文档中找到了这篇文章。它建议添加 -m,因此:

python SQLQuery.py -m inst1

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

4

2 回答 2

1

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

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

然后你会这样称呼它:

$ python -m foo bar
First arg is:  bar

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

于 2013-05-17T19:10:26.240 回答
1

忽略所有不相关的情况,听起来您的问题是您有一堆名为instance1, instance2,instance3等的全局对象,并且您想根据命令行参数在其中一个上调用某个方法,该参数的值类似于,但不等同于实例名称。

这可能不是一个好主意……但这并不难:

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全局变量放入可以索引的列表或字典中。

例如,假设你有一个字典,而不是instance1,等。现在代替这个:instance2instancesinstances['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

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

于 2013-05-17T19:07:41.430 回答