Передавать пути к файлам из Python в сценарий оболочки - PullRequest
2 голосов
/ 16 июня 2020

Я хотел бы запустить сценарий оболочки из Python 3 в Linux, передав два аргумента, которые содержат пути к двум разным файлам. Затем сценарий оболочки вызывает программу, написанную в Python 2.

В Python 3 я вызываю сценарий оболочки следующим образом:

import os
import sys    
os.chmod('/path/to/sh', 0o777)
subprocess.call(['/path/to/sh', '/path/to/file1', '/path/to/file2'], shell=True)

Мой сценарий оболочки выглядит так:

#!/bin/sh
set -x
path1=$1
path2=$2
python2 path/to/programme "$path1" "$path2"

Теперь пути к файлам пусты, и сценарий оболочки возвращает что-то вроде python2 path/to/programme '' ''. Кто-нибудь знает, как я могу правильно передать пути к файлам, чтобы программа, написанная на Python 2, могла их прочитать?

Или есть даже более простое решение, такое как использование подпроцесса для прямого вызова программы, написанной на Python 2?

Ответы [ 2 ]

3 голосов
/ 16 июня 2020

В сценарии оболочки нет необходимости. Вы можете использовать subprocess для запуска python2 напрямую.

a.py

#!/usr/bin/env python3

import subprocess

subprocess.call(['python2', './b.py', 'foo', 'bar'])

b.py

#!/usr/bin/env python2

import sys

print sys.argv

Выполняется ./a.py выводит ['./b.py', 'foo', 'bar'].

Вы также можете попробовать использовать вместо него past.translation :

Модуль past предоставляет экспериментальный пакет перевода, помогающий импортировать и использовать старые модули Python 2 в среде Python 3.

1 голос
/ 16 июня 2020

shell=True требуется только в том случае, если вы выполняете что-то вроде

subprocess.run("/path/to/sh /path/to/file1 /path/to/file2", shell=True)

, где оболочка разделит единственную строку на аргументы, которые будут идентифицироваться как имя программы и ее аргументы. Но у вас уже есть имя программы и ее аргументы, поэтому

subprocess.run(['/path/to/sh', '/path/to/file1', '/path/to/file2'])

- это все, что вам нужно.


Используя список и shell=True, вы, по сути, просите Python выполнить

sh -c /path/to/sh /path/to/file1 /path/to/file2

, который использует /path/to/file1 для установки значения $0, а не $1, в команде для выполнения.

...