سحب وإفلات بايثون
-
10-07-2019 - |
سؤال
أنا أعمل على محلل هنا يفتح ملفًا ويقرأه ويطبع البيانات في ملف آخر.
يتم تحديد ملف الإدخال من sys.argv[1] للتعامل مع فتح سطر الأوامر والسحب والإفلات (في نظام التشغيل Windows).ومع ذلك، عند سحب وإسقاط ملف، فإنه يعطيني
ioerror 13: Permission denied
بالنظر إلى ما يحتويه sys.argv، قمت بما يلي (من cmd.exe) لجعله يحتوي على نفس الشيء:
C:\>python C:\test\iotest.py C:\test\iotestin.txt
فشلت.ومع ذلك، يعمل ما يلي
C:\>cd test
C:\test>python iotest.py iotestin.txt
بالنسبة لي، ما ورد أعلاه سيكون/ينبغي أن يكون هو نفسه تقريبًا.
- لماذا أحصل على خطأ الإذن؟
- كيف أجعل لغة بايثون قادرة على التعامل مع المسارات المحددة بالكامل؟(إذا كانت هذه هي المشكلة.)
- كيف يمكنني تمكين السحب والإفلات؟
أوه، وإذا كان الأمر غير واضح، فأنا أقوم بسحب ملف الإدخال/النص إلى ملف بايثون، وليس العكس.باعتباري مبرمجًا، أفضّل دائمًا واجهة سطر الأوامر (CLI)، لكن المستخدمين المستقبليين لهذا البرنامج لا يفضلونها، وبالتالي أحتاج إلى تشغيل هذا الأمر.
على الرغم من أن الأمر بسيط للغاية، إليك بعض التعليمات البرمجية لإعادة إنتاج المشكلة:
import sys
print sys.argv
raw_input("")
try:
print "opening",sys.argv[1]
infile = open(sys.argv[1])
outfile = open("out.txt", "w")
raw_input("")
except IndexError:
print "usage:",sys.argv[0].split("\\")[-1],"FILE"
raw_input("")
exit()
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
raw_input("")
exit()
raw_input("done")
المحلول
انت تستخدم outfile = open("out.txt", "w")
- في المثال الأول، سينتقل هذا إلى c:\out.txt، والذي أتصور أنه مصدر الخطأ.
نصائح أخرى
قد يكون دليل العمل موجودًا C:\Window\System32
عندما تحصل على خطأ:خطأ في الإدخال:[إيرنو 2] لا يوجد مثل هذا الملف أو الدليل:أو 13:تم رفض الإذن.
لذلك تحتاج إلى التغيير إلى دليل البرنامج النصي أو ملف الإدخال أولاً.مثل:
os.chdir(os.path.split(sys.argv[0])[0])
إذا كنت تريد التغيير إلى مجلد ملف الإدخال، فحاول:
os.chdir(os.path.split(sys.argv[1])[0])