2010-03-04 29 views
11

Ben bir komut satırı aracı çalıştırmak için alt işlemi modülünden Popen işlevi kullanıyorum:Alt işlem nedir.Args parametresinin maksimum uzunluğu nedir?

subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0) 

kullanıyorum aracı dosyaları daha sonra süreçler bir listesini alır. Bazı durumlarda, bu dosya listesi çok uzun olabilir. Arc parametresinin olabileceği maksimum uzunluğu bulmanın bir yolu var mı?

Traceback (most recent call last): 
    File "dump_output_sopuids.py", line 68, in <module> 
    uid_map = create_sopuid_to_path_dict_dcmdump(dicom_files) 
    File "dump_output_sopuids.py", line 41, in create_sopuid_to_path_dict_dcmdump 
    dcmdump_output = subprocess.Popen(cmd,stdout=subprocess.PIPE).communicate(0)[0] 
    File "c:\python26\lib\subprocess.py", line 621, in __init__ 
    errread, errwrite) 
    File "c:\python26\lib\subprocess.py", line 830, in _execute_child 
    startupinfo) 
WindowsError: [Error 206] The filename or extension is too long 

bu maksimum uzunluğu bulmak için genel bir yolu var mı: dosyaların büyük sayıda aracına geçirilen, ben aşağıdaki hatayı alıyorum? Msdn: Command prompt (Cmd. exe) command-line string limitation ile ilgili şu makaleyi buldum ama değerindeki kodları zorlamak istemiyorum. Komutu birden fazla çağrıya bölmek için çalışma zamanında değeri almayı tercih ederim.

Windows XP üzerinde Python 2.6 kullanıyorum 64.

Düzenleme: ekleyerek kod örneği

paths = ['file1.dat','file2.dat',...,'fileX.dat'] 
cmd = ['process_file.exe','+p'] + paths 
cmd_output = subprocess.Popen(cmd,stdout=subprocess.PIPE).communicate(0)[0] 

paths listedeki her fiili giriş varsa genellikle çok uzun bir dosya yoludur VE nedeniyle sorun oluşur bunların binlerce var.

Komutu process_file.exe numaralı çağrıya birden çok çağrıya ayırmaktan çekinmem. Her koşuda kaç yol gönderileceğini bildiğim, hataların olabileceği maksimum uzunluğu elde etmenin genel bir yolunu arıyorum.

+0

Eğer args sağlamak şeyin bir örnek değer sağlayabilir? –

+0

Partiye oldukça geç kaldım ama PATH ortam değişkenimin birçok giriş ekledikten sonra çok uzun olması nedeniyle aynı hatayı aldığımı eklemek istiyorum. – RedX

cevap

9

Eğer shell = False iletiyorsanız, Cmd.exe gelmiyor.

Pencerelerde, alt işlem yeni işlemi oluşturmak için Win32 API'den CreateProcess işlevini kullanır. Bu işlev için documentation, ikinci argümanın (subprocess.list2cmdline tarafından oluşturulan) Unicode sonlandırıcı boş karakter de dahil olmak üzere maksimum 32.768 karakter uzunluğuna sahip olduğunu belirtir. LpApplicationName NULL ise, lpCommandLine'ın modül adı kısmı MAX_PATH karakterleriyle sınırlıdır.

Örneğinizi verdiğinizde, çalıştırılabilir (args [0]) için bir değer sağlamayı ve ilk parametreye ait args kullanmayı öneririm. CreateProcess belgelerinin ve alt işlem modülü kaynak kodunun okunması doğruysa, sorununuzu çözmeniz gerekir.

[değiştir: kaldırıldı args [1:] Windows makinesine ve test ellerimi aldıktan sonra bit]

+0

İlk parametre için args [1:] kullanımıyla ilgili öneriye uyup uymadığımı bilmiyorum. Sorumu bir kod örneği ile güncelledim. CreateProcess –

+0

bağlantı ve ipucu için +1 denedim ama hala bir limit isabet ediyorum: subprocess.Popen (cmd [1:] + yolları, çalıştırılabilir = cmd [0], stdout = altprocess.PIPE). Şimdilik, komut uzunluğunun sınırı olarak 32000 kullanıyorum ve komutumu birkaç kez çağırıp tüm çıktıları topluyorum. 32000 kodlu kodlamaya sahip olmamak ama bu değeri çevreden elde etmek istiyorum. –

+0

Belirtilen belgede belirtildiği gibi, 32768 sınırı CreateProcess ilkelinde kodlanmıştır (bu, 16 bit imzalı tamsayılar için üst sınırdır, yani 2 ** 15). List2cmd komut satırını oluştururken tırnak ve boşluk ekleyeceğinden, toplamdan önce bu sınırı vuracaksınız ([a (argalar için [a (a)]) 2 ** 15'e ulaşır. Argümanlarınızı yürütülebilir dosyaya iletmek için joker karakter kullanmanın bir yolu yok mu?(joker karakterler genellikle pencereler altındaki yürütülebilir dosyalar tarafından işlenir) –

İlgili konular