我一直在努力解决这个问题至少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脚本中调用它。
我在你手中,提前谢谢,最好的问候
答案 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>
处理反斜杠有三种方法,只要在字符串文字中使用反斜杠就需要使用它们:
r
使用原始字符串文字。这会导致反斜杠失去其特殊含义(好吧,sorta,如果反斜杠是字符串中的最后一个东西,它就不会像你期望的那样工作)。在这里使用第三个选项,我们有:
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)