คำสั่ง Python 3 os คืออะไรเพื่อสร้างไฟล์ข้อมูลที่เขียนได้และเส้นทาง C-Drive สำหรับแอปพลิเคชัน Windows 10 ทั่วไป

คำสั่ง Python 3 os คืออะไรเพื่อสร้าง "ไฟล์ข้อมูลที่เขียนได้และเส้นทาง C-Drive" สำหรับแอปพลิเคชัน Windows 10 ทั่วไป คำถามนี้มีหลายส่วน:

  1. โปรแกรม Python 3 ของฉันสร้างไฟล์ข้อมูล (หลายไฟล์) ตามวัตถุประสงค์ เมื่อตัวติดตั้ง MSI ของฉันติดตั้งลงใน /Programs ไฟล์ปฏิบัติการ Python ของฉันไม่ได้รับอนุญาตให้สร้างและเขียนไฟล์ข้อมูล ดังนั้นส่วนแรกของคำถามของฉันคือ: ฉันจำเป็นต้องเปลี่ยนโปรแกรม Python 3 เพื่อสร้างไฟล์ข้อมูลในไดเร็กทอรีเฉพาะหรือไม่ (โดยใช้ความสามารถของระบบปฏิบัติการ) และคุณช่วยยกตัวอย่างให้ฉันได้ไหม

  2. ส่วนที่สองของคำถามของฉันคือ: ตัวเลือกคำสั่ง os ใดที่สามารถช่วยฉันในการค้นหาไดเร็กทอรี windows 10 ของพีซี Windows 10 ทั่วไป (เช่นพาธโฮม, พาธ AppData ฯลฯ )

  3. โปรดทราบว่าฉันกำลัง cx_Freezing ในตัวติดตั้ง MSI ดังนั้นทุกอย่างจะต้องเป็นอัตโนมัติสำหรับการติดตั้งระยะไกลทั่วไปจากคลาวด์ (google ไดรฟ์หรือ GitHub) โดยตัวติดตั้ง MSI ดังนั้นโปรดจำไว้เสมอเมื่อตอบ 1 และ 2 ข้างต้น

ข้อควรสนใจ: นี่คือตัวติดตั้ง MSI สำหรับโปรแกรมนี้: แอปพลิเคชันการจัดการผู้ติดต่อ WINDOWS 10 ใหม่

https://drive.google.com/drive/folders/0Bz98wvqqw-1QRUNFcUJLU21yT1k

ขอขอบคุณล่วงหน้าสำหรับความรู้และประสบการณ์ด้านการเขียนโปรแกรมของคุณ

ขอขอบคุณสำหรับความช่วยเหลือด้านเทคนิคและการชี้แจงของคุณ


person Michael Hughes    schedule 24.09.2017    source แหล่งที่มา


คำตอบ (1)


ฉันขอแนะนำให้คุณหลีกเลี่ยงการจัดเก็บไฟล์และไดเรกทอรีโดยตรงในโฟลเดอร์โปรไฟล์ของผู้ใช้ (เช่น ตัวแปรสภาพแวดล้อม UserProfile) หรือโฟลเดอร์หลัก (เช่น "%HomeDrive%%HomePath%") สิ่งนี้แตกต่างจากวิธีปฏิบัติทั่วไปใน Unix สำหรับโฮมไดเร็กตอรี่ (หากเราเพิกเฉยต่อข้อมูลจำเพาะไดเร็กทอรีฐาน XDG) แต่เมื่ออยู่ใน Redmond ให้ทำตามที่ Microsofties ทำ

สร้างโฟลเดอร์ที่มีชื่อเฉพาะสำหรับแอปพลิเคชันในตำแหน่งต่อไปนี้อย่างน้อยหนึ่งตำแหน่ง: โฟลเดอร์ข้อมูลภายในเครื่อง (ต่อผู้ใช้) โฟลเดอร์ข้อมูลการโรมมิ่ง (ต่อผู้ใช้) หรือโฟลเดอร์ข้อมูลโปรแกรม (ต่อเครื่อง) โปรดทราบว่าโฟลเดอร์เหล่านี้จะถูกซ่อนไว้โดยค่าเริ่มต้น เนื่องจากโดยทั่วไปแล้วผู้ใช้ไม่ได้ถูกกำหนดให้เข้าถึงโดยตรง

ใช้โฟลเดอร์ข้อมูลในเครื่องสำหรับแคช ใช้โฟลเดอร์ข้อมูลโรมมิ่งสำหรับข้อมูลผู้ใช้และการกำหนดค่าแบบมีสถานะ ใช้โฟลเดอร์ข้อมูลโปรแกรมสำหรับข้อมูลและแคชที่ไม่เฉพาะเจาะจงสำหรับผู้ใช้ ตัวอย่างเช่น โปรแกรมอย่าง pip สามารถใช้โฟลเดอร์ข้อมูลโปรแกรมเพื่อแคชแพ็คเกจที่ดาวน์โหลด (ในทางปฏิบัติ pip แคชแพ็กเกจต่อผู้ใช้ แต่โดยหลักการแล้ว มันสามารถแคชต่อเครื่องได้)

หากแอปพลิเคชันของคุณใช้โฟลเดอร์ข้อมูลโปรแกรม ตรวจสอบให้แน่ใจว่าโฟลเดอร์นั้นให้สิทธิ์ผู้ใช้ทั้งหมดในการเพิ่มและแก้ไขโฟลเดอร์ย่อยและไฟล์ หากคุณสร้างโฟลเดอร์อย่างเกียจคร้าน คุณสามารถเพิ่มการอนุญาตด้วยตนเองได้ ดูคำตอบนี้เพื่อดูตัวอย่างวิธีแก้ไขความปลอดภัยของไฟล์

ตัวแปรสภาพแวดล้อมสำหรับโฟลเดอร์ข้อมูลโลคัล โรมมิ่ง และโปรแกรมคือ LocalAppData, AppData และ ProgramData ตามลำดับ ใน Windows XP ค่าหลังคือ "%AllUsersProfile%\Application Data" และอาจมีการแปล "ข้อมูลแอปพลิเคชัน" โดยทั่วไปคุณไม่ควรใช้ตัวแปรสภาพแวดล้อมเหล่านี้ในแอปพลิเคชัน

เนื่องจากโฟลเดอร์ที่รู้จัก/พิเศษส่วนใหญ่สามารถย้ายตำแหน่งได้ง่ายใน Explorer จึงควรถามเชลล์สำหรับเส้นทางปัจจุบันโดยการเรียก SHGetFolderPath หรือฟังก์ชัน SHGetKnownFolderPath ที่ใหม่กว่า แทนที่จะใช้ตัวแปรสภาพแวดล้อมและตำแหน่งเริ่มต้น คุณสามารถใช้ ctypes สำหรับสิ่งนี้ได้หากคุณต้องการอยู่ในไลบรารีมาตรฐานของ Python แต่ใช้ PyWin32 ได้ง่ายกว่าซึ่งสามารถติดตั้ง pip เป็นแพ็คเกจ "pypiwin32" ได้

นี่คือ Known Folder GUID สำหรับข้อมูล เอกสาร และไฟล์สื่อ:

            User                    System
ProgramData                         FOLDERID_ProgramData
Local       FOLDERID_LocalAppData
Roaming     FOLDERID_RoamingAppData
Desktop     FOLDERID_Desktop        FOLDERID_PublicDesktop
Documents   FOLDERID_Documents      FOLDERID_PublicDocuments
Downloads   FOLDERID_Downloads      FOLDERID_PublicDownloads
Music       FOLDERID_Music          FOLDERID_PublicMusic
Pictures    FOLDERID_Pictures       FOLDERID_PublicPictures
Videos      FOLDERID_Videos         FOLDERID_PublicVideos

ต่อไปนี้คือค่าคงที่ CSIDL ที่เกี่ยวข้อง ยกเว้นค่าคงที่สำหรับ "ดาวน์โหลด":

            User                    System
ProgramData                         CSIDL_COMMON_APPDATA
Local       CSIDL_LOCAL_APPDATA
Roaming     CSIDL_APPDATA
Desktop     CSIDL_DESKTOP           CSIDL_COMMON_DESKTOPDIRECTORY
Documents   CSIDL_PERSONAL          CSIDL_COMMON_DOCUMENTS
Music       CSIDL_MYMUSIC           CSIDL_COMMON_MUSIC
Pictures    CSIDL_MYPICTURES        CSIDL_COMMON_PICTURES
Videos      CSIDL_MYVIDEO           CSIDL_COMMON_VIDEO

SHGetKnownFolderPath ไม่ได้ถูกห่อด้วย PyWin32 ฉันมีคำตอบอื่นที่เรียกมันผ่าน ctypes หรือคุณสามารถใช้ PyWin32 เพื่อสร้างอินสแตนซ์ KnownFolderManager ตัวอย่างเช่น:

import pythoncom
from win32com.shell import shell

kf_mgr = pythoncom.CoCreateInstance(shell.CLSID_KnownFolderManager, None, 
            pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IKnownFolderManager)

downloads_path = kf_mgr.GetFolder(shell.FOLDERID_Downloads).GetPath()

หรือเรียกใช้ฟังก์ชันเดิม SHGetFolderPath ด้วยค่าคงที่ CSIDL ตัวอย่างเช่น:

from win32com.shell import shell, shellcon

SHGFP_TYPE_CURRENT = 0
SHGFP_TYPE_DEFAULT = 1

local_data_path = shell.SHGetFolderPath(None, shellcon.CSIDL_LOCAL_APPDATA, 
                    None, SHGFP_TYPE_CURRENT)
person Eryk Sun    schedule 24.09.2017
comment
ฉันซาบซึ้งมากกับคำตอบโดยละเอียดของ eryksun คำตอบนี้จะมีประโยชน์มากสำหรับนักพัฒนา Windows 10 Python 3 หลายคน Stackoverflow เป็นแหล่งโซลูชันที่ยอดเยี่ยม โดยเฉพาะอย่างยิ่งสำหรับนักพัฒนาที่เรียนรู้พื้นฐานบนแพลตฟอร์มทั่วไป เช่น Windows 10 - person Michael Hughes; 12.10.2017