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
3 odpowiedzi
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 przezos.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ąć.
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.
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 /.
Podobne pytania
Powiązane pytania
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.