سؤال

أنا أعمل على محلل هنا يفتح ملفًا ويقرأه ويطبع البيانات في ملف آخر.

يتم تحديد ملف الإدخال من 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])

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