2013-07-16 2 views
0

scp 명령을 래핑하기 위해 sys.argv을 사용하는 스크립트를 작성하려고합니다. 아이디어는 실행할 수있을 것입니다 : pyscp folder/* host을하지만 그 인수로이 스크립트를 실행하는 경우 :파이썬에서 sys.argv의 별

import sys 

for arg in sys.argv: 
    print arg 

나는 folder 안에있는 모든 폴더의 목록을 얻을 :

pyscp.py 
folder/0 
folder/1 
folder/2 
folder/3 
folder/4 
folder/5 
folder/67 
folder/8 
folder/9 
host 
+3

예상되는 동작은 무엇입니까? –

답변

6

가정 UNIXoid 운영 체제 : 셸이 *을 일치하는 파일로 확장 중입니다. 따옴표가 * 문자를 해석에서 쉘을 유지

pyscp "folder/*" host 

처럼 스크립트를 호출하려고합니다.

+0

흠 감사합니다! 이상적인 해결책은 아니지만 작동합니다 :-) – andy

+0

@andy - 쉘이 확장을하도록하십시오. 당신은'files = sys.argv [1 : -1]'과'host = sys.argv [-1]'라고 말할 수 있으며 여러분의 프로그램은 모두가 기대하는 것처럼 쉘과 함께 작동 할 것입니다. 음 ... 어쩌면이게 답이 될 수도 있습니다. – tdelaney

2

별표를 이스케이프하지 않으면 쉘이 파일 이름 확장을 수행하고 있습니다. 별표를 포함하는 패턴은 파이썬 프로그램이 실행되기 전에 패턴과 일치하는 알파벳순으로 정렬 된 파일 이름 목록으로 대체됩니다. 예를 들어 쉘을 사용하여 쉘이 파일 이름 확장을 수행하지 못하게 할 수 있습니다. 작은 따옴표는, 즉

pyscp 'folder/*' hostname 

그런 다음 glob 모듈 및 제어 일 당신이 그것을 원하는 방식을 사용하여 파이썬에서 자신이 작업을 수행 할 수 있습니다.

+0

'*'는 별표이고'&'는 앰퍼샌드입니다. – thegrinner

+0

둘 다 a로 시작하고 종종 다음과 같이 혼합합니다. :-) –

+1

@ Jan-PhilipGehrcke'*'는 애스펙트 ... oids와 같은 별입니다. 그리고'&'는 앰퍼샌드입니다. – glglgl

-2

셸이 파일 목록을 확장하고 있습니다. 명령에서 여러 매개 변수를 허용하여이를 활용할 수 있습니다.

import sys 
files = sys.argv[1:-1] 
host = sys.argv[-1] 

이제 그가 (리눅스 시스템에서) Folder2 폴더에서 마지막 날에 변경된 폴더 1을 더한 것도 어쩌면 모든 텍스트 파일처럼 전송을 원하는대로 농구를 통해 발신자 점프를 할 수있는보다 유연한 프로그램이 :

pyscp folder1/*.txt `find -mtime -1` example.com 
+0

그런 식의 백틱에서'find'를 사용하는 것은 잘못된 접근입니다. 문자열을 분리하고 glob를 확장하면 찾기 결과가 나오므로 이름에 공백, 공백 또는 glob 표현식이 포함 된 파일 이름이 잘못 나오는 경우가 있습니다. 따라서 더 안전한 접근법은 다음과 같다 :'a =(); IFS = ''읽기 -r -d ''; do + = ("답장"); done <<(찾기. -mtime -1 -print0); pyscp folder1/*. txt "$ {a [@]}"example.com' –

+0

@Charles Duffy. 도대체 무엇이. 핵심은 파일을 선택하기 위해 쉘을 사용할 수 있으며 파일 이름에 공백이나 쉘 메타 문자가 없다는 것을 알고 있다면 find 예제가 잘 작동한다는 것입니다. – tdelaney

+0

언제 스크립트를 실행하거나 실행시킬 파일을 _know_ 알 수 있습니까? 임의의 조건이 충족 될 때 깨지는 코드를 작성하는 것은 무모한 것입니다. 마찬가지로 다른 사람들에게 그것을 제공합니다. 또한 http://mywiki.wooledge.org/BashPitfalls의 항목 # 1을 참조하십시오. –