Подпроцесс включает проблемные кавычки в Python 3.7+

Проблема

У меня возникают ошибки с модулем Python3 subprocess. Подпроцесс окружает некоторые важные позиционные аргументы, которые я даю ему с кавычками Unicode, что приводит к сбою команды linux find.

У кого еще возникла эта проблема? В основном я пытаюсь выяснить, является ли это неправильной конфигурацией с моей стороны или я должен опубликовать ее как проблему для команды подпроцесса. Я уверен, что мог бы обойти это в своем коде, но мне показалось, что это ошибка, которую нужно устранить.

test.py
import subprocess
p = subprocess.run(['find', '/.snapshots/*/snapshot', '-maxdepth', '0', '-type', 'd' ], capture_output=True, encoding='utf-8')
print(p)
test.py result
CompletedProcess(
  args=['find', '/.snapshots/*/snapshot', '-maxdepth', '0', '-type', 'd'], 
  returncode=1,
  stdout='',
  stderr='find: ‘/.snapshots/*/snapshot’: No such file or directory\n'
)

Мой взгляд

Мне кажется, что подпроцесс заставляет find заключать мою строку пути в кавычки Unicode, и что bash просто регистрирует эти кавычки как еще один символ, как всегда делает команда find.

Intended command
user@mine:$ find /.snapshots/*/snapshot/ -maxdepth 0 -type d
/.snapshots/1/snapshot/
/.snapshots/2/snapshot/
/.snapshots/3/snapshot/
Command it seems to be running
user@mine:$ find ‘/.snapshots/*/snapshot’ -maxdepth 0 -type d
find: ‘‘/.snapshots/*/snapshot\’’: No such file or directory

Тот факт, что кавычки являются юникодными, не проблема. С командой find (по крайней мере, по моему опыту с версиями, которые я использовал) вы просто не хотите передавать путь, заключенный в кавычки любого рода. Даже если есть обходной путь, который заставляет это поведение работать для команды find, все равно кажется проблемой ожидание следующей программы bash, которая не ожидает кавычек.

Another failed find command
user@mine:$ find '/.snapshots/*/snapshot' -maxdepth 0 -type d
find: '/.snapshots/*/snapshot': No such file or directory

Сведения о системе

Когда я впервые столкнулся с этой проблемой, я использовал Python 3.7.4. Я обновился, чтобы узнать, есть ли исправление, поэтому теперь я использую python 3.8.1. Я работаю на Arch Linux, поэтому я ожидаю, что это могут быть типичные проблемы с использованием программного обеспечения, которое все еще находится в стадии тестирования.


person user1783713    schedule 03.01.2020    source источник
comment
Глобы и кавычки - это оболочка. Здесь не задействована оболочка.   -  person Ry-♦    schedule 03.01.2020
comment
Кавычки не проблема; они просто часть сообщения об ошибке после того, как find уже не удалось. Проблема в том, что глобус не расширяется, потому что вы не используете оболочку для запуска команды, а /.snapshots/*/snapshot воспринимается буквально.   -  person chepner    schedule 03.01.2020


Ответы (1)


Вместо использования glob (который оболочка должна расширять перед find запуском), используйте следующее:

p = subprocess.run(['find', '/.snapshots/', '-path', '*/snapshot', '-maxdepth', '2', '-type', 'd' ], capture_output=True, encoding='utf-8')

Аргумент -path — это шаблон, предназначенный для самого find, чтобы использовать сопоставление с любым файлом, найденным в /.snapshots.

person chepner    schedule 03.01.2020