Saya tidak bisa mendapatkan proses untuk membuka direktori dengan benar di Windows karena garis miring ke depan

Saya perlu menggunakan subprocess.Popen untuk membuka jendela explorer (hanya di Windows) dengan jalur tetapi jalur yang saya gunakan memiliki garis miring dan ini tidak berhasil, hanya membuka jendela PC explorer umum. Jika saya menggantinya secara manual dengan garis miring terbalik, itu berfungsi dengan baik, tetapi saya ingin ini terjadi pada jalur variabel.

Saya sudah mencoba menggunakan os.path.dirname dalam upaya "menormalkan" jalurnya, tetapi ini juga tidak berhasil. TKI, kode ini hanya memberi saya jendela penjelajah PC umum:

myRoot = "D:/SomePath/Somefile"
subprocess.Popen(r'explorer /select, myRoot')

atau bahkan:

myRoot = "D:/SomePath/Somefile"
subprocess.Popen(r'explorer /select, os.path.abspath(myRoot)')

tapi ini berhasil:

myRoot = "D:\SomePath\Somefile"
subprocess.Popen(r'explorer /select, myRoot')

Saya juga mencoba mengganti secara manual string garis miring itu tetapi saya tidak bisa mendapatkannya tidak peduli berapa banyak cara yang saya coba (jadi jelas melakukan sesuatu yang salah). Ada petunjuk? (Saya HANYA membutuhkan ini untuk bekerja di Windows, dan tidak mungkin saya bisa membuat garis miring tidak masuk karena saya membaca dari file yang dibuat dengan program luar).

Saya menghargai bantuan yang coba diberikan oleh orang-orang -- izinkan saya mencoba menjelaskan hal ini. Garis jalur masuk dari file luar yang tidak dapat saya kendalikan. Jadi SELALU terlihat seperti contoh dengan garis miring, yang TIDAK berfungsi dengan membuka subproses explorer tidak peduli bagaimana saya mencobanya (termasuk contoh yang diberikan di bawah).

Namun, jika saya secara manual menyediakan jalur dengan garis miring terbalik, itu berhasil. Jadi yang saya perlukan adalah sesuatu yang akan mengubah jalur garis miring ke arah garis miring terbalik. Dan sejauh ini tidak ada saran yang berhasil.


person Mike Kelley    schedule 03.05.2019    source sumber
comment
Apa maksud Anda dengan saya juga mencoba mengganti string garis miring ke depan secara manual tetapi saya tidak bisa mendapatkannya tidak peduli berapa banyak cara saya mencoba? Dalam contoh ketiga Anda, dengan garis miring ke belakang, Anda mengatakan itu berhasil.   -  person Niels Henkens    schedule 03.05.2019
comment
Metode ke-2 berhasil   -  person Smart Manoj    schedule 03.05.2019
comment
Tidak, tidak ada pengganti yang berhasil. Yang kedua (dengan .replace) membawa saya ke direktori My Documents (aneh karena jalurnya ada di drive D: jadi tidak ada C: di sana sama sekali). Dan apa yang saya katakan dengan tidak ada penggantian yang berhasil, maksud saya tidak ada penggantian yang dihitung yang berhasil. Saya dapat menulis jalur secara manual dengan garis miring yang benar, tetapi apa pun yang saya coba untuk mengganti garis miring tersebut secara terprogram, garis miring tersebut tidak berfungsi -- garis miring tersebut tidak akan menggantikannya atau mengembalikan jalur yang benar.   -  person Mike Kelley    schedule 03.05.2019
comment
OKE!!!! SUKSES -- terima kasih SmartManoj! ITU berhasil (tidak begitu yakin bagaimana mengatakan ini adalah jawabannya ketika itu terkubur di sini, tetapi menurut saya menggunakan kurung kurawal adalah kuncinya). Mungkin Anda bisa mempostingnya sebagai jawaban yang kemudian bisa saya beri suara positif?   -  person Mike Kelley    schedule 03.05.2019


Jawaban (2)


cukup yakin ini tidak ada hubungannya dengan "garis miring", tetapi disebabkan oleh beberapa kebingungan lain tentang cara kerja Python dan bagaimana argumen perintah berpindah dari satu proses ke proses lainnya.

myRoot = "D:/SomePath/Somefile"
subprocess.Popen(rf'explorer /select, {os.path.abspath(myRoot)}')

berfungsi, karena variabel Python telah diperluas ke dalam string yang diteruskan ke Popen, ini setara dengan:

cmdline = rf'explorer /select, {os.path.abspath(myRoot)}'
subprocess.Popen(cmdline)

yang juga setara dengan:

cmdline = 'explorer /select, {root}'.format(
    root=os.path.abspath(myRoot))
subprocess.Popen(cmdline)

awalan f pada string dikenal sebagai "f-string" (pendek untuk literal string yang diformat)

jika Anda print(cmdline) Anda akan melihatnya telah diperluas menjadi: "explorer /select, D:/SomePath/Somefile" dan karenanya jalurnya bisa sampai ke proses MS Explorer.

ketika Anda menjalankan Popen(r'explorer /select, myRoot') variabel myRoot tidak diperluas dan karenanya Explorer hanya melihat teks "myRoot" yang kemungkinan besar diabaikan.

Alternatif yang disarankan adalah meneruskan list ke Popen, yang setiap elemennya menjadi argumen baris perintah terpisah. Misalnya:

Popen(['explorer', '/select', myRoot])

yang sepertinya Anda coba lakukan, tetapi tidak berhasil.

Masalah lain yang sepertinya Anda alami adalah masalah dengan "escape sequence" dan string. Saat Anda menulis kode, garis miring terbalik ditulis sebagai '\\' tetapi ini hanya satu karakter setelah diuraikan. Misalnya dengan:

myRoot = "D:\\SomePath\\Somefile"
print(myRoot)

hanya akan mencetak: D:\SomePath\Somefile. Variabel ini juga akan berfungsi dengan baik dengan panggilan Popen di atas.

Awalan r menonaktifkan penanganan escape ini, dan dirancang untuk "ekspresi reguler" (atau "regexp", lihat re Modul Python). Ada banyak sekali artikel tentang ini, semoga sebagian yang saya tulis mengandung beberapa keyworkds yang dipahami Google.

person Sam Mason    schedule 03.05.2019
comment
Terima kasih, itu menjelaskan banyak hal (dan membawa saya ke tempat yang saya inginkan). Saya memberi suara positif tetapi dikatakan dengan kurang dari 15 repetisi tidak akan ditampilkan/dihitung, tetapi saya memiliki 15 repetisi jadi agak tidak mengerti mengapa itu tidak berhasil). - person Mike Kelley; 04.05.2019

Gunakan modul pathlib.

from pathlib import Path
myRoot = Path("D:/path/to/wherever")

Ini juga berfungsi dengan subprocess

person isaactfa    schedule 03.05.2019