كيف يمكنني تنفيذ برنامج من الثعبان ؟ نظام التشغيل.النظام فشل بسبب مسافات في المسار

StackOverflow https://stackoverflow.com/questions/204017

  •  03-07-2019
  •  | 
  •  

سؤال

لدي بيثون السيناريو الذي يحتاج إلى تنفيذ برنامج خارجي ، ولكن لسبب ما فشل.

إذا كان لدي البرنامج النصي التالي:

import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();

ثم فشل مع رسالة الخطأ التالية:

'C: emp\a' لم يتم التعرف داخلي أو خارجي ، operable برنامج أو ملف دفعي.

إذا كنت الهروب من البرنامج مع اقتباسات:

import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();

ثم يعمل.ومع ذلك ، إذا قمت بإضافة المعلمة ، توقف عن العمل مرة أخرى:

import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();

ما هي الطريقة الصحيحة لتنفيذ البرنامج وانتظر حتى يكتمل ؟ أنا لا تحتاج إلى قراءة الناتج من ذلك ، كما هو البصري البرنامج الذي يقوم بعمل ثم يخرج, ولكن أنا في حاجة إلى الانتظار حتى يكتمل.

نلاحظ أيضا نقل البرنامج إلى غير متباعدة المسار ليس خيارا أيضا.


هذا لا يعمل إما:

import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();

ملاحظة تبديل واحد/علامات الاقتباس المزدوجة.

مع أو بدون معلمة إلى المفكرة هنا فشل مع رسالة الخطأ

اسم الملف أو اسم الدليل أو بناء جملة تسمية وحدة التخزين غير صحيح.

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

المحلول

subprocess.call سوف تجنب المشاكل مع وجود للتعامل مع نقلا عن الاتفاقيات المختلفة قذائف. أنه يقبل قائمة، بدلا من سلسلة، بحيث يتم بفواصل الحجج بسهولة أكبر. أي بمعنى.

import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])

نصائح أخرى

وإليك طريقة مختلفة للقيام بذلك.

إذا كنت تستخدم ويندوز الأفعال التالية مثل الملف في مستكشف، أو إعطاء اسم ملف كحجة إلى الأمر DOS "بداية" النقر المزدوج: فتح الملف مع أي تطبيق (إن وجدت) امتدادها ويرتبط معها.

filepath = 'textfile.txt'
import os
os.startfile(filepath)

مثال:

import os
os.startfile('textfile.txt')

وهذا سيفتح textfile.txt مع المفكرة إذا يرتبط المفكرة مع ملفات .txt.

وتستهلك ونقلت الأبعد عن طريق بيثون نفسها، وقذيفة ويندوز لا أرى ذلك. وكما ذكر أعلاه، ويندوز يفهم فقط-التنصيص. بيثون سيتم تحويل خفضت إلى الأمام في الخطوط المائلة العكسية على ويندوز، لذلك يمكنك استخدام

os.system('"C://Temp/a b c/Notepad.exe"')

وو'المستهلكة بيثون، الذي ثم يمر "C: // درجة الحرارة / أ ب ج / NOTEPAD.EXE" (كمسار ويندوز، لا خطوط مائلة عكسية مزدوجة الحاجة) إلى CMD.EXE

وعلى الأقل في ويندوز 7 وبيثون 3.1، os.system في نظام التشغيل Windows يريد سطر الأوامر <م> نقلت المزدوج إذا كان هناك مسافات في المسار إلى الأوامر. على سبيل المثال:

  TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'
  os.system(TheCommand)

وهناك مثال في العالم الحقيقي الذي التعكز لي هو استنساخ حملة في فيرتثلبوإكس. الحل subprocess.call فوق لم تنجح بسبب بعض المسألة حقوق الوصول، ولكن عندما ضعف نقلت-الأمر، وأصبح os.system سعيد:

  TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \
                 + ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
  os.system(TheCommand)
import win32api # if active state python is installed or install pywin32 package seperately

try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass

وأظن أنها نفس المشكلة عند استخدام الاختصارات في ويندوز ... جرب هذا:

import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");

لبيثون> = يجب استخدام 3.5 subprocess.run في مكان subprocess.call

https://docs.python.org /3/library/subprocess.html#older-high-level-api

import subprocess
subprocess.run(['notepad.exe', 'test.txt'])

لنفترض أننا نريد لتشغيل جانغو خادم الويب (في لينكس) أن هناك مساحة بين المسار (path='/home/<you>/<first-path-section> <second-path-section>') ، لذلك قم بما يلي:

import subprocess

args = ['{}/manage.py'.format('/home/<you>/<first-path-section> <second-path-section>'), 'runserver']
res = subprocess.Popen(args, stdout=subprocess.PIPE)
output, error_ = res.communicate()

if not error_:
    print(output)
else:
    print(error_)

[ملاحظة]:

  • لا ننسى الوصول إلى إذن: chmod 755 -R <'yor path'>
  • manage.py هو exceutable: chmod +x manage.py
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top