Mam pytanie o prosty skrypt. Celem skryptu jest znalezienie wszystkich plików TGZ w podkatalogu i wyodrębnij wszystkie pliki TIF z nich, które mają B4 lub B5 na końcu nazwy pliku. Po tym shoyld przeniesie te pliki do określonego podkatalogu (odpowiednio pasma4 lub Band5).

Wydaje się, że działa dobrze na mojej maszynie Ubuntu 12.04, ale kiedy kumpel kopalni wykonuje go na swojej maszynie Windows 7, które pęknie. Z tego, co rozumiem, skrypt wywołuje polecenia Linux i Windows Cant zinterpretować je poprawne (nie można znaleźć plików * .tgz). Zastanawiałem się, czy istnieje sposób, aby system operacyjny Agnostic osiągnął te same wyniki.

import subprocess, shlex, os, sys
cmd1 = "find . -name *.tgz" 
cmd2 = "xargs -i pigz -dv {}"
args1 = shlex.split(cmd1)
args2 = shlex.split(cmd2)

p1 = subprocess.Popen(args1, stdout=subprocess.PIPE)
p2 = subprocess.Popen(args2, stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]

cmd1 = "find . -name *.tar" 
cmd2 = "xargs -i tar -xfv {} --wildcards '*B5.TIF' '*B6.TIF' '*B8.TIF' -C %s" % repo 
args1 = shlex.split(cmd1)
args2 = shlex.split(cmd2)

p1 = subprocess.Popen(args1, stdout=subprocess.PIPE)
p2 = subprocess.Popen(args2, stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]

pathname = os.path.dirname(sys.argv[0])
b4 = os.path.abspath(pathname)+'/Band_4'
b5 = os.path.abspath(pathname)+'/Band_5'

os.mkdir(b4)
os.mkdir(b5)

cmd1 = "find . -name *B4.TIF" 
cmd2 = "xargs -i mv -if {} Band_4" 
args1 = shlex.split(cmd1)
args2 = shlex.split(cmd2)

p1 = subprocess.Popen(args1, stdout=subprocess.PIPE)
p2 = subprocess.Popen(args2, stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]

cmd1 = "find . -name *B5.TIF" 
cmd2 = "xargs -i mv -if {} Band_5" 
args1 = shlex.split(cmd1)
args2 = shlex.split(cmd2)

p1 = subprocess.Popen(args1, stdout=subprocess.PIPE)
p2 = subprocess.Popen(args2, stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]

Błąd Traceback:

Traceback (most recent call last):
 File "[PATH]\bands.py", line 36, in <module>
   p2 = subprocess.Popen(args2, stdin=p1.stdout, stdout=subprocess.PIPE)
 File "C:\Python27\ArcGIS10.2\lib\subprocess.py", line 711, in _init_
   errread, errwrite)
 File "C:\Python27\ArcGIS10.2\lib\subprocess.py", line 948, in _execute_child
   startupinfo)
WindowsError: [Error 2] The system cannot find the file specified
File not found - *.tgz
0
Phill 15 sierpień 2014, 01:38

3 odpowiedzi

Najlepsza odpowiedź

Nie powinno być zbyt twarde, o ile rozumiesz, co robi skrypt i jakie są używane polecenia / narzędzia:

  • {{X0}. / a> i fnmatch.filter ( Zobacz Ta odpowiedź na przykład)
  • xargs musiała zostać zastąpiona pętla Pythona {X1}}, która działa na ścieżkach znalezionych przez os.walk
  • {{X0}. moduł
  • tar można wymienić tarfile biblioteka
  • {{X0}. A >.

Oto początek:

import errno
import fnmatch
import os
import re
import shutil
import tarfile


cwd = os.getcwd()
REPO = os.path.join(cwd, "repo")


def find(directory, pattern):
    for root, dirnames, filenames in os.walk(directory):
        for fn in filenames:
            if fnmatch.fnmatch(fn.lower(), pattern.lower()):
                yield os.path.join(root, fn)


def mkdir_p(path):
    try:
        os.makedirs(path)
    except OSError as exc:
        if exc.errno == errno.EEXIST and os.path.isdir(path):
            pass
        else:
            raise


def mv(src, dst):
    try:
        shutil.move(src, dst)
    except shutil.Error, e:
        print "%s, moving on" % e


def matching_tif_files(members):
    pattern = re.compile(r'.*B[4568].tif', re.I)
    for tarinfo in members:
        if pattern.match(tarinfo.name):
            print "Extracting %s" % tarinfo.name
            yield tarinfo


targz_files = find(cwd, '*.tgz')

for tgz in targz_files:
    print tgz
    with tarfile.open(tgz) as tar:
        tar.extractall(path=REPO, members=matching_tif_files(tar))


b4 = os.path.join(cwd, 'Band_4')
b5 = os.path.join(cwd, 'Band_5')

mkdir_p(b4)
mkdir_p(b5)

b4_tifs = find(cwd, '*B4.tif')
for tif in b4_tifs:
    mv(tif, b4)

b5_tifs = find(cwd, '*B5.tif')
for tif in b5_tifs:
    mv(tif, b5)

Skrypt rzeczywiście zrobił kilka rzeczy inaczej od tego, jak je opisałeś. Na przykład --wildcards '*B5.TIF' '*B6.TIF' '*B8.TIF nie pasuje do *B4.TIF. Dostosowałem tych, jak widziałem dopasowanie. Z pewnością nie jest jeszcze doskonały, ale powinno się rozpocząć.

4
Community 23 maj 2017, 11:57

Sam Python oferuje biblioteki agnostyczne platformy (takie jak shutil), aby wykonać ogólne operacje systemowe. Istnieje tarfile uchwyt uchwytu (kompresja w / gz). Złóż razem, możesz sformułować cały skrypt w czystym pytonie. Będzie jednak mnóstwo pracy, więc czy jest warto w porównaniu do użycia Cygwin (zgodnie z sugestią @joeews), zależy znacznie od tego, jak ważne jest skrypt. W przyszłości wersja Pythona będzie bardziej utrzymująca się w przyszłości.

0
Alexander Gessler 14 sierpień 2014, 21:45

Well Python domyślnie nie jest zainstalowany w systemie Windows. W PHP możliwe jest określenie systemu operacyjnego. Następnie na podstawie tego mają różne polecenia w zależności od tego.

W systemie Windows wiele można zrobić za pomocą VBScript, a nowsze wersje Windows mają PowerShell, umieść coś w miejscu, w którym Windows ma Dir.exe Commando, aby to działać. To nie jest piękne rozwiązanie, ale wtedy nie dodasz wielu danych do serwera znajomych.

Prawdopodobnie zadawanie twojego przyjaciela, aby dodać Pythona na swój serwer PHP byłby dla Ciebie najłatwiejszy. Dla niego może być nieco złożony, ponieważ musi zintegrowany z jego serwerem PHP i zostać wykonanym (a nie otwartym edytorem Python), dostałem zainstalowany Blendere, ale (instaluje Pythona), ale pliki .py nie są wykonywane, chyba że nazywam ich jak folder (C: dev folder Python.exe myscript.py).

Najlepiej, aby naprawdę zainstalować Pythona na swoim systemie PHP na bazie systemu Windows http://blog.chromperstomp.com/installing-Python-mod_python-on- Xampp /.

-1
user219279 14 sierpień 2014, 22:04