从Batch文件向Python脚本发送和RETURNING参数

时间:2015-12-17 15:39:49

标签: batch-file

Sending arguments from Batch file to Python script已打开一个主题。这很好。

但是,从Python脚本返回参数值似乎存在问题。

我用两个参数调用我的Python脚本。第一个是字符串,第二个是使用字符串%project_name%初始化的环境变量hello

Python脚本处理输入字符串sys.argv[1]并从字符串中的最终\之外提取子字符串。然后将此子字符串复制到sys.argv[2]中,然后应该是变量%project_name%的新值。

但是,当我首先从Windows命令行运行时,一切正常,但更新后的sys.argv[2]不会传回%project_name%

请参阅命令提示符窗口中执行的以下命令:

set project_name=hello

echo "%project_name%"
"hello"

"C:\python27\python" GetProject.py "#p=/Product Delivery/Product Delivery.pj#s=Team Projects/Team Projects.pj#s=Platform Pack/Platform Pack.pj#s=GERAN SAT(A)/project.pj" %project_name%
Extracting project
project.pj
Returning project
project.pj

echo "%project_name%"
"hello"

我的Python脚本是:

import os, sys
stext = sys.argv[1]
startpos = stext.rindex("/") # get the final "/" character in the input    string
rtext = stext[startpos+1:]  # extracty the substring after this delimiter 
print "Extracting project "
print rtext
sys.argv[2] = rtext  # return this to the calling program
print "Returning project "
print sys.argv[2]

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

没有必要使用Python脚本从字符串中获取最后/和字符串结尾之间或最后/和最后一个句点之间的子字符串。这可以使用例如命令 FOR

来完成

演示命令处理器的此功能的示例:

批处理文件是:

@echo off
if "%~1" == "" goto :EOF
for %%I in ("%~1") do set "project_name=%%~nI"
echo Project name is: %project_name%

使用参数:

调用上面的批处理文件
"#p=/Product Delivery/Product Delivery.pj#s=Team Projects/Team Projects.p j#s=Platform Pack/Platform Pack.pj#s=GERAN SAT(A)/My Project.pj"

输出结果为:

Project name is: My Project

在批处理文件中使用%%~nxI代替%%~nI会产生输出:

Project name is: My Project.pj

这可用作命令处理器在文件/文件夹字符串中解释/之类的\,以便与Unix路径兼容。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • call /?
  • for /?

在这两个命令的帮助输出上,解释了为文件和文件夹名称设计的特殊代码%~1%%~nxI%%~nI。但是%%~nxI%%~nI也适用于任何其他字符串,如果命令处理器不需要找出存储具有给定字符串的文件/文件夹的位置,因为至少有一个反斜杠或正斜杠,字符串中的最后一个/\之后的一个句点。

好吧,批处理文件也可以是:

@echo off
if "%~1" == "" goto :EOF
set "project_name=%~n1"
echo Project name is: %project_name%

但我想回答你的问题并解释为什么你的方法根本无法发挥作用。

命令处理器cmd.exe在运行Python之前将%project_name%扩展为其值hello。 Python脚本从命令处理器传递字符串hello,而不是环境变量的名称。

字符串hello存储在Windows从整个RAM为被调用的Python解释器分配的内存块中。此内存块中还分配了一个3指针数组,指向内存中的3个参数字符串。

我不是Python专家,但行sys.argv[2] = rtext最有可能导致释放用于字符串hello的内存并将字符串变量rtext的地址分配给指针中的第三个指针数组sys.argv

这个字符串内存和指针管理当然对完全不同地址的RAM中命令处理器的环境表没有影响。

工作是将确定的字符串打印到设备标准输出,该设备被命令处理器重定向,并且写入设备标准输出的字符串被分配给环境变量{{ 1}}。

Python脚本project_name是:

GetProject.py

这个Python脚本是从批处理文件调用的:

import os, sys
stext = sys.argv[1]
startpos = stext.rindex("/") # get the final "/" character in the input string
rtext = stext[startpos+1:]   # extract the substring after this delimiter 
print rtext                  # output string to device stdout

但是使用Python脚本来获取带或不带文件扩展名的项目文件的名称绝对没有必要。