سؤال

أحاول استخدام OS.System () لاستدعاء برنامج آخر يأخذ مدخلات وملف إخراج. الأمر الذي أستخدمه هو ~ 250 حرفًا بسبب أسماء المجلدات الطويلة.

عندما أحاول الاتصال بالأمر ، أحصل على خطأ: The input line is too long.

أظن أن هناك 255 character limit (بنيت باستخدام مكالمة نظام C ، لكنني لم أتمكن من العثور على القيود على ذلك أيضًا).

حاولت تغيير الدليل مع os.chdir() لتقليل أطوال مسار المجلد ، ولكن عندما أحاول استخدام os.system() مع "..\folder\filename" يبدو أنه لا يمكنه التعامل مع أسماء المسارات النسبية. هل هناك أي طريقة للتغلب على هذا الحد أو الحصول عليها للتعرف على المسارات النسبية؟

هل كانت مفيدة؟

المحلول

يجب عليك استخدام وحدة المعالجة الفرعية بدلاً من ذلك. نرى هذه Doc Little لكيفية إعادة كتابة مكالمات نظام OS.System لاستخدام العملية الفرعية.

نصائح أخرى

حتى أنها فكرة جيدة لاستخدامها subprocess.Popen(), ، هذا لا يحل المشكلة.

مشكلتك ليست حد 255 حرفًا, ، كان هذا صحيحًا في DOS Times ، حيث زاد لاحقًا إلى 2048 لنظام التشغيل Windows NT/2000 ، وزاد مرة أخرى إلى 8192 لنظام التشغيل Windows XP+.

ال حل حقيقي هو حل علة قديمة جدًا في واجهات برمجة تطبيقات Windows: _popen () و _wpopen ().

إذا استخدمت اقتباسات من أي وقت مضى خلال سطر الأوامر ، فعليك إضافة الأمر بأكمله في quoates أو ستحصل على The input line is too long رسالة خطأ.

تحتوي جميع أنظمة تشغيل Microsoft التي تبدأ بـ Windows XP على حد 8192 حرفًا وهو الآن كافٍ الآن لأي استخدام لسطر الأوامر اللائق لكنهم نسوا حل هذا الخطأ.

للتغلب على خطأهم فقط قم بتضمين أمرك بالكامل في عروض أسعار مزدوجة, ، وإذا كنت تريد معرفة المزيد تعليق MSDN على _popen ().

كن حذرا لأن هذه الأعمال:

prog
"prog"
""prog" param"
""prog" "param""

لكن هذه لن تعمل:

""prog param""

إذا كنت بحاجة إلى وظيفة تضيف عروض الأسعار عند الحاجة ، فيمكنك أخذ واحدة http://github.com/ssbarnea/tendo/blob/master/tendo/tee.py

يجب أن تستخدم عملية فرعية بدلا من OS.System.

تتمتع العمليات الفرعية بميزة القدرة على تغيير الدليل لك:

import subprocess
my_cwd = r"..\folder\"
my_process = subprocess.Popen(["command name", "option 1", "option 2"], cwd=my_cwd)
my_process.wait() # wait for process to end
if my_process.returncode != 0:
    print "Something went wrong!"

تحتوي وحدة المعالجة الفرعية على بعض وظائف المساعد أيضًا إذا كان ما سبق يبدو مطولاً قليلاً.

Assuming you're using windows, from the backslashes, you could write a .bat file from python and then os.system() on that. It's a hack.

Make sure when you're using '\' in your strings that they're being properly escaped.

Python uses the '\' as the escape character, so the string "..\folder\filename" evaluates to "..folderfilename" since an escaped f is still an f.

You probably want to use

r"..\folder\filename"

or

"..\\folder\\filename"

I got the same message but it was strange because the command was not that long (130 characters) and it used to work, it just stopped working one day. I just closed the command window and opened a new one and it worked. I have had the command window opened for a long time (maybe months, it's a remote virtual machine). I guess is some windows bug with a buffer or something.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top