0

我已经为这个问题苦苦挣扎了至少 1 个小时,现在我放弃了,我需要你宝贵的帮助..

我想要做的是在 python 脚本中运行 python 脚本,传递一些参数。

到目前为止,我已经使用 bat 文件完成了这项工作,如下所示:

测试.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 脚本中调用该脚本,如下所示:

测试.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 脚本中调用它。

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

4

3 回答 3

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+' ])

这与您的第一个问题相同,而且未能按照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(它会在终端发出哔哔声)。

有三种处理反斜杠的方法,您需要在任何时候在字符串文字中使用反斜杠时采用这些方法:

  • 将所有反斜杠加倍。Python 将两个反斜杠解释为一个反斜杠,并且后面的字符没有任何特殊含义。
  • 通过在字符串文字前加上 . 来使用原始字符串文字r。这会导致反斜杠失去其特殊含义(好吧,如果反斜杠是字符串中的最后一件事,它就不会像您期望的那样工作)。
  • 对于 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 进程是一种重量级的方式来做这样的事情;可能有更好的方法,例如importing 脚本并调用它的main()方法。

于 2013-09-11T15:45:34.517 回答
1

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

编辑:这是appcfg.py 的源代码。这应该可以帮助您找到所需的功能。

编辑 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) 列出了 '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
于 2013-09-11T15:59:14.573 回答
0

我会尝试做这样的事情。

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

我会查看操作系统文档的这一部分。

祝你好运。

于 2013-09-11T15:37:39.810 回答