Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Popen给出随机结果_Python_Shell - Fatal编程技术网

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的问题。