Другой общий случай, когда можно получить это исключение, включает в себя насмешливые классы во время модульного тестирования. Независимо от используемой насмешливой структуры, вы должны убедиться, что все соответствующие уровни иерархии классов должным образом высмеиваются. В частности, все свойства HttpContext
, на которые ссылается тестируемый код, должны быть изделены.
См. « Исключение NullReferenceException при проверке пользовательского AuthorizationAttribute » для несколько подробного примера.
Вам нужно предоставить shell=True
для выполнения команды через интерпретатор оболочки. Если вы это сделаете, вы больше не сможете предоставлять список в качестве первого аргумента, потому что тогда будут переданы аргументы. Вместо этого укажите необработанную командную строку, которую вы хотите передать в оболочку:
proc = subprocess.Popen('ls *.bc', shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
Расширение *
glob является частью оболочки, но по умолчанию subprocess
выполняет not отправку ваших команд через оболочку, поэтому выполняется команда (первый аргумент, ls
) , тогда в качестве аргумента используется литерал *
.
Это хорошо, см. блок предупреждения в разделе «Часто используемые аргументы» , подпроцессов docs , Он главным образом обсуждает последствия для безопасности, но также помогает избежать ошибок глупого программирования (так как нет никаких волшебных символов оболочки, о которых нужно беспокоиться)
Моя основная жалоба с shell=True
заключается в том, что обычно это лучший способ перейдите к проблеме - в вашем примере вы должны использовать модуль glob
:
import glob
files = glob.glob("*.bc")
print files # ['file1.bc', 'file2.bc']
Это будет быстрее (без накладных расходов на запуск), более надежным и перекрестным платформа (не зависит от платформы, имеющей команду ls
)