编写Python脚本以使用控制台命令执行
研究是在底部,阅读之前-1'ing。。。谢谢 我必须编写一个运行SQL查询的Python脚本。我创建了一个主类,名为SQLQuery。每个SQLQuery实例表示一个查询。脚本的结构必须如下所示:编写Python脚本以使用控制台命令执行,python,linux,command-line,scripting,command-line-arguments,Python,Linux,Command Line,Scripting,Command Line Arguments,研究是在底部,阅读之前-1'ing。。。谢谢 我必须编写一个运行SQL查询的Python脚本。我创建了一个主类,名为SQLQuery。每个SQLQuery实例表示一个查询。脚本的结构必须如下所示: class SQLQuery(object): def __init___(self, string_myQuery)... instance1 = SQLQuery(SQLQuery1)... instance2 = SQLQuery(SQLQuery2)... $ python
class SQLQuery(object):
def __init___(self, string_myQuery)...
instance1 = SQLQuery(SQLQuery1)...
instance2 = SQLQuery(SQLQuery2)...
$ python -m foo bar
First arg is: bar
根据用户要求,实例必须与类位于同一个文件中(因此我不能将每个实例都设置为main并单独执行该文件),并且每个实例都必须使用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时,我不能将它们作为模块导入。忽略所有不相关的内容,听起来您的问题是您有一堆名为
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()
做同样事情的一个更好的方法是将
实例
全局变量放入一个可以索引的列表或dict中
例如,假设您得到了一个实例
dict,其中包含实例['1']
,实例[2]
,而不是实例1
,等等,而不是实例
inst_name = 'instance' + inst_number
instance = globals()[inst_name]
instance.execute()
…你只要这样做:
instances[inst_number].execute()
此外,与其提出一个命令行参数,该参数中有额外的东西,您必须解析并丢弃,而且对人类读者来说,与代码相比,没有更多的意义,为什么不只取一个数字呢
python myscript.py 12
或者,使用创建一个参数,该参数可以以所有明显的方式使用:
python myscript.py --instance=12
python myscript.py --instance 12
python myscript.py -i12
python myscript.py -i 12
无论哪种方式,您的代码都会获得字符串'12'
,然后可以使用该字符串查找函数,如上所述。您的-m
选项语法错误。假设您有以下文件名为foo.py
:
import sys
print 'First arg is: ', sys.argv[1]
那么你会这样称呼它:
class SQLQuery(object):
def __init___(self, string_myQuery)...
instance1 = SQLQuery(SQLQuery1)...
instance2 = SQLQuery(SQLQuery2)...
$ python -m foo bar
First arg is: bar
请注意,省略了“.py”扩展名。然后,您可以使用命令行参数来决定要使用哪个对象,或者使用argparse
或optparse
模块来处理该参数。为什么不向脚本传递一个命令行参数,告诉它要运行哪个实例?您提供的结构没有意义SQLQuery
将自身作为基类,并将自身作为\uuuuu init\uuuu
参数?另外,什么是MainClass
和SQLQuery1
?另外,该文档建议在哪里添加-m
?它描述了-m
如何作为python
本身的一个参数工作,它意味着按名称查找和执行模块;这并不意味着-m
作为脚本的参数意味着什么。签出,构建一个命令行界面Martineau,这就是我要做的。你已经描述了我的问题。abarnert,没关系。谢谢你bogatron,但我不能调用外部文件。这是用户需求。也许我不理解你的问题。我不是建议你调用外部文件。上面的foo.py
文件是您的SQLQuery.py
文件。您可以使用命令行参数来决定在文件中使用哪个对象。如果您试图在现有的Python进程中创建命令行来创建新对象,那么您应该考虑Python < Cult>多进程< /C>模块,这将使您能够轻松地建立一个服务器进程,可以从命令行访问该模块,从而在模块内创建新对象。如果我有更多的代表,我会投上更高的票。其他人只是挑出不相关的东西,投下我的票,因为他们找不到我在文章底部做的研究。我想下次我会把我的研究放在首位。我会试着把这些实例编入字典。这似乎是最简单、最干净的解决方案,而且它不必是人类可读的,因为服务器每天都会在计时器上运行命令。@JaneGoodall:作为提问者,接受正确的答案或对最佳答案的评论,以解释在值得接受之前如何改进,比向上投票更重要。