gpt4 book ai didi

Python subprocess.popen 在与子进程交互时失败

转载 作者:太空宇宙 更新时间:2023-11-04 05:13:35 24 4
gpt4 key购买 nike

我有一个用于 Xamarin 应用程序的 python 构建脚本,我需要根据语言环境将其编译成不同的 ipa 和 apk。

该脚本操作 info.plist 和 Android list 中的必要值,然后使用 subprocess.popen 调用 xbuild 构建每个版本。或者至少应该是这样。

问题是当我无论如何与子进程交互时(基本上我需要等到它完成才能开始更改下一个版本的值)

这个有效:

    build_path = os.path.dirname(os.path.realpath(__file__))
ipa_path = "/path/to/my.ipa"

cmd = '/Library/Frameworks/Mono.framework/Versions/4.6.2/Commands/xbuild /p:Configuration="Release" /p:Platform="iPhone" /p:IpaPackageDir="%s" /t:Build %s/MyApp/iOS/MyApp.iOS.csproj' % (ipa_path, build_path)

subprocess.Popen(cmd, env=os.environ, shell=True)

然而,这将导致 python 脚本与构建并行继续。

如果我这样做:

    subprocess.Popen(cmd, env=os.environ, shell=True).wait()

Xbuild 失败并显示以下错误消息:

    Build FAILED.
Errors:

/Users/sune/dev/MyApp/iOS/MyApp.iOS.csproj: error :
/Users/sune/dev/MyApp/iOS/MyApp.iOS.csproj: There is an unclosed literal string.
Line 2434, position 56.

它会在调用后几毫秒内失败,而通常构建过程需要几分钟

subprocess.popen 的任何其他简写方法(例如 .call、.check_call)以及 subprocess.poll 和 subprocess.communicate 的基础操作都会导致发生相同的错误。

真正奇怪的是,即使调用 time.sleep 也会引发同样的错误:

    subprocess.Popen(cmd, env=os.environ, shell=True)

time.sleep(2)

我不明白,因为据我了解,我也应该能够做这样的事情:

    shell = subprocess.Popen(cmd, env=os.environ, shell=True)

while shell.poll() is None:
time.sleep(2)

print "done"

本质上实现与调用 shell.wait() 相同的效果

编辑:使用命令列表而不是字符串

如果我像这样使用命令列表和 shell=False

      cmd = [
'/Library/Frameworks/Mono.framework/Versions/4.6.2/Commands/xbuild',
'/p:Configuration="Release"',
'/p:Platform="iPhone"',
'/p:IpaPackageDir="%s' % ipa_path,
'/t:Build %s/MyApp/iOS/MyApp.iOS.csproj' % build_path

]

subprocess.Popen(cmd, env=os.environ, shell=False)

然后是这样的结果:

    MSBUILD: error MSBUILD0003: Please specify the project or solution file to build, as none was found in the current directory.

非常感谢任何输入。我在这里用头撞墙。

最佳答案

我坚信这是不可能的。肯定是subprocess模块​​实现方式的一个缺点。

xbuild 在构建期间生成多个子进程,如果轮询状态,python 中的子进程将发现其中一个具有非零返回状态,并停止执行一个或多个 xbuild 子进程,导致构建失败,因为描述。

我最终使用 bash 脚本进行编译并使用 python 操作 xml 文件等。

关于Python subprocess.popen 在与子进程交互时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42373860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com