微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python用win路径子处理多个命令

如何解决python用win路径子处理多个命令

我正在尝试通过 conda 触发 Python 脚本的执行。

然后我会捕获输出并将其报告给执行此操作的命令提示符。

这基本上是最简单的概念

wrap.py - 包装器意图多次执行以下脚本

import subprocess
def wrap():
    while True:
        cmd1=r"call C:\\Users\\my_user\\anaconda3\\Scripts\\activate.bat"
        cmd2=r"cd C:\\myfolder\\mysubfolder"
        cmd3=r"C:\\Users\\my_user\\anaconda3\\python.exe C:\\myfolder\\mysubfolder\\test.py"
        proc = subprocess.run([cmd1,cmd2,cmd3])
if __name__ == '__main__':
    wrap()

test.py - 必须执行的脚本

def mytest():
   print("success")
if __name__ == '__main__':
    mytest()

由于 mytest 打印成功一次,我希望包装器的输出(在 anaconda 上运行)为

(base) C:\myfolder\mysubfolder> python wrap.py
success
success
success
...

我试过

1 - subprocess.Popen

2 - 是否使用 shell=True

3 - 使用列表 ["first command","second command","third command"] 或单个字符串 "first;second;third"

4 - 使用或删除字符串前面的“r”,这里的空格破坏了游戏

5 - 使用单或双“”

6- 在 my_user 中,下划线也导致编码错误

我实际上尝试复制至少 20 个不同的 stackoverflow“解决方案”,但没有一个真正适合我。我也正确阅读了 python 文档的子处理页面,但这没有帮助。

感谢任何提示,我迷路了。

解决方法

语法 subprocess.run([cmd1,cmd2,cmd3]) 表示使用 cmd1cmd2 作为 cmd3 的命令行参数运行 cmd1。相反,您想要执行单个 shell 命令序列;您在此处尝试执行的一些操作需要 shell,因此您确实需要 shell=True,它规定使用单个字符串作为输入,而不是由命令及其参数组成的列表。

(Windows 在幕后有一些挑剔的处理,这使得使用字符串列表作为 shell=True 的第一个参数并非完全不可能;但这确实不是可移植的或显而易见的。只是不要。 )

关于此处对 shell=True 的要求,诸如 callcd(以及 Bourne 系列 shell 中的 source.)之类的命令是 shell 内置的 - ins 不作为单独的二进制文件存在;如果您没有 shell=True,您只会得到“未找到命令”或您当地的等效信息。 (在其他情况下,您通常应该avoid shell=True when you can. 但这不是其中一种情况;在这里,如果不进行重大代码更改,这确实是不可避免的。)

如果你的 shell 是 cmd 我猜命令可能看起来像

subprocess.run(
    r"call C:\Users\my_user\anaconda3\Scripts\activate.bat & C:\Users\my_user\anaconda3\python.exe C:\myfolder\mysubfolder\test.py",shell=True)

或在字符串前没有 r 并且所有反斜杠都加倍的等效相同; r"..." 字符串和常规 "..." 字符串之间的唯一区别是前者允许您输入文字反斜杠,而后者需要您对它们进行转义;在前一种情况下,字符串中的所有内容都是文字,而在后一种情况下,您可以使用符号表示法,例如 \n 表示换行符,\t 表示制表符等.

在 Python 中,使用单引号还是双引号并不重要;您可以在它们之间自由切换,显然只要您使用相同的开始和结束引号。如果字符串中需要文字单引号,请使用双引号,这样您就不必反斜杠转义文字引号,反之亦然。还有一个三引号字符串,它接受任何一个引用字符,但允许跨越多行,即包含文字换行符而不引用它们。

如果您的首选 shell 是 shbash,则相同的语法如下

subprocess.run(r"""
    source C:\Users\my_user\anaconda3\Scripts\activate.bat &&
    C:\Users\my_user\anaconda3\python.exe C:\myfolder\mysubfolder\test.py""",shell=True)

我在这两种情况下都省略了 cd,因为您的代码中似乎没有任何内容要求子进程在特定目录中运行。如果您确实有这个要求,您可以在 cwd=r'C:\myfolder\mysubfolder' 之后添加 shell=True 以在单独的目录中运行整个子进程。

subprocess.run()设施不足的情况,需要下到裸露的subprocess.Popen(),自己打理周围的水管;但这显然不是这些场景之一。如果可以,您应该远离 Popen(),尤其是在您对子流程的理解不是很深入的情况下。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?