在python脚本中运行python文件,传递参数

时间:2013-09-11 15:31:23

标签: python google-app-engine arguments

我一直在努力解决这个问题至少1小时,现在我放弃了,我需要你的宝贵帮助..

我正在尝试做的是在python脚本中运行python脚本,传递一些参数。

直到现在,我已经使用bat文件完成了这项工作,如下所示:

test.bat的

...
SET fileName='c:\works\files\file.xml'
SET url='someurl'
SET table='tablename'
c:\Python27\python.exe "C:\Program Files (x86)\Google\google_appengine\appcfg.py" upload_data --config_file=C:\works\config.yaml --filename="%fileName%" --url="%url%" --kind="%table%"

这很有效。现在我需要在另一个python脚本中调用该脚本,如下所示:

test.py

...
fileName = 'c:\works\files\file.xml'
url = 'someurl'
table = 'tablename'
if(os.path.exists(fileName):
  print 'exists!'
  #launch appcfg.py here!!
else:
  print 'file missing'

文件被正确找到,'exists!消息被正确显示,但我现在不知道如何调用那个python文件..我已经尝试了这两个命令,但它们不起作用(也许这是路径中的白色空间?我不知道如何得到那个......)

首次尝试:失败

os.system('c:\Python27\python.exe "C:\Program Files (x86)\Google\google_appengine\appcfg.py" upload_data --config_file=C:\works\config.yaml --filename='+fileName+' --url='+url+' --kind='+table)

第二次尝试:双重失败

subprocess.call(['c:\Python27\python.exe','"C:\Program Files (x86)\Google\google_appengine\appcfg.py" upload_data --config_file=C:\works\config.yaml --filename='+fileName+' --url='+url+' --kind='+table ])

我希望我没有一些复制/粘贴错误,重点是我不知道如何将这么多参数传递给另一个脚本,在主python脚本中调用它。

我在你手中,提前谢谢,最好的问候

3 个答案:

答案 0 :(得分:1)

你第一次尝试失败的原因显而易见:

os.system('c:\Python27\python.exe "C:\Program Files (x86)\Google\google_appengine\appcfg.py" upload_data --config_file=C:\works\config.yaml --filename='+fileName+' --url='+url+' --kind='+table+')

这是语法错误;在右括号之前有一个额外的+符号和撇号。换句话说,该行应结束:

... +table)

第二次尝试失败的原因同样明显:

subprocess.call(['c:\Python27\python.exe','"C:\Program Files (x86)\Google\google_appengine\appcfg.py" upload_data --config_file=C:\works\config.yaml --filename='+fileName+' --url='+url+' --kind='+table+' ])

与第一个 plus 相同的问题是,您未能按照subprocess.call()的要求将命令的各个参数分解为单独的列表项。你也不需要在包含空格的参数周围使用双引号(这些是关于什么是参数的shell的提示;这里不需要这个,因为shell不会处理这个并且你已经打破了参数)。换句话说,它看起来应该更像:

subprocess.call(['c:\Python27\python.exe','C:\Program Files (x86)\Google\google_appengine\appcfg.py', 'upload_data', '--config_file=C:\works\config.yaml',  '--filename='+fileName, '--url='+url, '--kind='+table])

现在你还有问题......反斜杠。反斜杠是Python字符串文字中的转义字符,导致下一个字符具有特殊含义。字符串中的大多数反斜杠都不在具有任何特殊含义的字符之前,因此它们不会引起任何问题......但是,\a会转换为ASCII BEL(会发出哔声)。< / p>

处理反斜杠有三种方法,只要在字符串文字中使用反斜杠就需要使用它们:

  • 加倍你所有的反斜杠。 Python将两个反斜杠解释为单个反斜杠,并且后面的字符没有任何特殊含义。
  • 在字符串文字前加r使用原始字符串文字。这会导致反斜杠失去其特殊含义(好吧,sorta,如果反斜杠是字符串中的最后一个东西,它就不会像你期望的那样工作)。
  • 对于Windows路径名,只需使用正斜杠而不是反斜杠。 Windows很满意!

在这里使用第三个选项,我们有:

subprocess.call(['c:/Python27/python.exe','C:/Program Files (x86)/Google/google_appengine/appcfg.py', 'upload_data', '--config_file=C:/works/config.yaml',  '--filename='+fileName, '--url='+url, '--kind='+table])

启动另一个Python进程是一种重量级的方式来做这样的事情;可能有更好的方法,例如import脚本并调用其main()方法。

答案 1 :(得分:1)

为什么不导入其他python脚本?然后,您可以将正确的参数传递给它的主函数。

编辑:这是appcfg.py's source。这可以帮助您找到所需的功能。

编辑2: 以下是一些有用的代码:

import appcfg
appcfg_globals = dict([(var, eval('appcfg.' + var))for var in dir(appcfg)])
# Insert arguments into appcfg_globals
appcfg.run_file_(appcfg.__file__, appcfg_globals)

工作原理: DIR(模块)的 列出'module'中的所有变量,如下所示:

['__builtins__', '__doc__', '__file__', '__name__', '__package__', [...]]

但我们想要一个形式的词典:

{
 '__builtins__': {[...]},
 '__doc__': [...],
 '__file__': 'C:\Program Files (x86)\Google\google_appengine\appcfg.py',
 '__name__': 'appcfg',
 '__package__': [...],
 [...]
}

因此,我们使用eval获取与名称关联的值,并将它们与这样的元组中的名称相关联:(variable_name,variable_value)。 dict()完成其余的工作!

剩下要做的就是插入参数。我会让你自己找到它!

证明这有效:

my_test.py:

my_globals = globals()

在Python中:

>>> import my_test
>>> my_test.my_globals == dict([(var, eval('my_test.' + var))for var in dir(my_test)])
True

答案 2 :(得分:0)

我会尝试做这样的事情。

os.system("appcfg.py arg1 arg2 arg3")

我会查看os文档的这一部分。

古德勒克。