Python Popen给出随机结果
我写了一段简单的代码:Python Popen给出随机结果,python,shell,Python,Shell,我写了一段简单的代码: import subprocess p=subprocess.Popen('mkdir -p ./{a,b,c}', shell=True, stderr=subprocess.STDOUT) p.wait() 不幸的是,它并不总是像我期望的那样。也就是说,当我在我的电脑上运行它时,一切都正常(ls-l给我三个指令:a、b和c)。但当我的同事在他的桌面上运行它时,他会。。。一个目录名为:“{a,b,c}”。。。我们都使用Python 2.7.3。为什么呢?你将如何修复它
import subprocess
p=subprocess.Popen('mkdir -p ./{a,b,c}', shell=True, stderr=subprocess.STDOUT)
p.wait()
不幸的是,它并不总是像我期望的那样。也就是说,当我在我的电脑上运行它时,一切都正常(ls-l给我三个指令:a、b和c)。但当我的同事在他的桌面上运行它时,他会。。。一个目录名为:“{a,b,c}”。。。我们都使用Python 2.7.3。为什么呢?你将如何修复它
我试图自己找到答案。根据手册:
args应该是程序参数序列,或者是单个字符串。默认情况下,如果args是序列,则要执行的程序是args中的第一项。如果args是字符串,则解释取决于平台,如下所述。有关与默认行为的其他区别,请参阅shell和可执行参数。除非另有说明如上所述,建议按顺序传递参数。“
所以我尝试在shell中执行代码:
python -c "import subprocess; p=subprocess.Popen(['mkdir', '-p', './{ea,fa,ga}'], shell=True, stderr=subprocess.STDOUT); p.wait()"
我得到:
mkdir: missing operand
我将感谢你的任何建议
谢谢 据我所知,os.mkdir(path,[mode])方法在处理多平台项目时使用起来更安全
os.mkdir(os.getcwd()/a)
但是,它没有采用子进程方法那么优雅。语法是
bash
语法,并非所有shell都支持
文件说:
在具有shell=True
的Unix上,shell默认为/bin/sh
。如果args是
字符串,该字符串指定要通过shell执行的命令
因此,只有将/bin/sh
符号链接到支持该语法的shell(如bash
或zsh
)时,您的命令才起作用。您的同事可能正在使用dash
或其他不支持此功能的shell
您不应该依赖用户的默认shell之类的东西。相反,请使用完全展开来编写full命令:
p = subprocess.Popen('mkdir -p ./a ./b ./c', shell=True, stderr=subprocess.STDOUT)
这里有几个问题
- 第一:如果您使用的是一系列参数,请不要设置“shell=True”(。将其设置为False,您将看到mkdir命令将被接受
- “/{a,b,c}”是bash中的一种特定语法。如果您的同事使用的是不同的shell,它可能无法工作,或者行为也不一样
- 您应该使用python“mkdir”命令,而不是调用shell命令,它将在服务器/shell/OS上运行
- 谢谢大家的回答。
似乎最好的方法就是简单地使用/bin/sh语法。我将代码改为使用:
'mkdir -p ./a ./b ./c'
正如你所建议的
我避免使用mkdir()函数,因为我正在编写一个包含大量系统调用的脚本,并且我希望提供优雅的--dry run选项(这样我就可以列出所有命令)
问题已解决-谢谢!您(和您的同事)在什么操作系统上运行它?如果都是linux,您使用的是什么shell?不同的shell可能会给出不同的结果。Duplicates@endragor我不认为这是重复的。这个问题是关于
/{a,b,c}
语法,而不是mkdir-p
命令本身。您的代码不起作用,需要使用引号:os.getcwd()+“/a”
。这也不能回答特定OP的问题。