Thay đổi thư mục hiện tại của quá trình tập lệnh là tầm thường. Tôi nghĩ rằng câu hỏi thực sự là làm thế nào để thay đổi thư mục hiện tại của cửa sổ lệnh mà từ đó tập lệnh Python được gọi, điều này rất khó. Một tập lệnh dơi trong Windows hoặc tập lệnh bash trong shell bash có thể thực hiện điều này với lệnh CD thông thường vì bản thân shell là trình thông dịch. Trong cả Windows và Linux Python là một chương trình và không có chương trình nào có thể thay đổi trực tiếp môi trường của cha mẹ. Tuy nhiên, sự kết hợp của một tập lệnh shell đơn giản với tập lệnh Python thực hiện hầu hết các công cụ cứng có thể đạt được kết quả mong muốn. Ví dụ: để tạo một lệnh CD mở rộng có lịch sử truyền tải để xem lại lùi/chuyển tiếp/chọn, tôi đã viết một tập lệnh Python tương đối phức tạp được gọi bởi một tập lệnh dơi đơn giản. Danh sách truyền tải được lưu trữ trong một tệp, với thư mục đích trên dòng đầu tiên. Khi tập lệnh Python trở lại, tập lệnh dơi đọc dòng đầu tiên của tệp và biến nó thành đối số với CD. Tập lệnh dơi hoàn chỉnh [trừ ý kiến cho sự ngắn gọn] là:
if _%1 == _. goto cdDone
if _%1 == _? goto help
if /i _%1 NEQ _-H goto doCd
:help
echo d.bat and dSup.py 2016.03.05. Extended chdir.
echo -C = clear traversal list.
echo -B or nothing = backward [to previous dir].
echo -F or - = forward [to next dir].
echo -R = remove current from list and return to previous.
echo -S = select from list.
echo -H, -h, ? = help.
echo . = make window title current directory.
echo Anything else = target directory.
goto done
:doCd
%~dp0dSup.py %1
for /F %%d in [ %~dp0dSupList ] do [
cd %%d
if errorlevel 1 [ %~dp0dSup.py -R ]
goto cdDone
]
:cdDone
title %CD%
:done
Tập lệnh Python, DSUP.Py là:
import sys, os, msvcrt
def indexNoCase [ slist, s ] :
for idx in range[ len[ slist ]] :
if slist[idx].upper[] == s.upper[] :
return idx
raise ValueError
# .........main process ...................
if len[ sys.argv ] < 2 :
cmd = 1 # No argument defaults to -B, the most common operation
elif sys.argv[1][0] == '-':
if len[sys.argv[1]] == 1 :
cmd = 2 # '-' alone defaults to -F, second most common operation.
else :
cmd = 'CBFRS'.find[ sys.argv[1][1:2].upper[]]
else :
cmd = -1
dir = os.path.abspath[ sys.argv[1] ] + '\n'
# cmd is -1 = path, 0 = C, 1 = B, 2 = F, 3 = R, 4 = S
fo = open[ os.path.dirname[ sys.argv[0] ] + '\\dSupList', mode = 'a+t' ]
fo.seek[ 0 ]
dlist = fo.readlines[ -1 ]
if len[ dlist ] == 0 :
dlist.append[ os.getcwd[] + '\n' ] # Prime new directory list with current.
if cmd == 1 : # B: move backward, i.e. to previous
target = dlist.pop[0]
dlist.append[ target ]
elif cmd == 2 : # F: move forward, i.e. to next
target = dlist.pop[ len[ dlist ] - 1 ]
dlist.insert[ 0, target ]
elif cmd == 3 : # R: remove current from list. This forces cd to previous, a
# desireable side-effect
dlist.pop[ 0 ]
elif cmd == 4 : # S: select from list
# The current directory [dlist[0]] is included essentially as ESC.
for idx in range[ len[ dlist ]] :
print[ '[' + str[ idx ] + ']', dlist[ idx ][:-1]]
while True :
inp = msvcrt.getche[]
if inp.isdigit[] :
inp = int[ inp ]
if inp < len[ dlist ] :
print[ '' ] # Print the newline we didn't get from getche.
break
print[ ' is out of range' ]
# Select 0 means the current directory and the list is not changed. Otherwise
# the selected directory is moved to the top of the list. This can be done by
# either rotating the whole list until the selection is at the head or pop it
# and insert it to 0. It isn't obvious which would be better for the user but
# since pop-insert is simpler, it is used.
if inp > 0 :
dlist.insert[ 0, dlist.pop[ inp ]]
elif cmd == -1 : # -1: dir is the requested new directory.
# If it is already in the list then remove it before inserting it at the head.
# This takes care of both the common case of it having been recently visited
# and the less common case of user mistakenly requesting current, in which
# case it is already at the head. Deleting and putting it back is a trivial
# inefficiency.
try:
dlist.pop[ indexNoCase[ dlist, dir ]]
except ValueError :
pass
dlist = dlist[:9] # Control list length by removing older dirs [should be
# no more than one].
dlist.insert[ 0, dir ]
fo.truncate[ 0 ]
if cmd != 0 : # C: clear the list
fo.writelines[ dlist ]
fo.close[]
exit[0]
6 Câu trả lời cho câu hỏi này.
Chỉ cần nhập mô -đun "HĐH" và nhập đường dẫn bạn muốn nó được thay đổi.
Nhập hệ điều hành
os.chdir[path]
Hy vọng nó hoạt động!!
Nếu bạn là người mới bắt đầu và cần biết thêm về Python, thì bạn nên tham gia Chứng nhận & NBSP; Python & NBSP; khóa học hôm nay.
Thanks!
• 3,440 points
Nếu bạn muốn thực hiện một cái gì đó như tùy chọn "CD ..", chỉ cần nhập:
os.chdir[".."]
Nó giống như trong Windows CMD: CD .. Tất nhiên & NBSP; Nhập OS & NBSP;import os is neccessary [e.g type it as 1st line of your code]
Trình quản lý bối cảnh: Nhập CD HĐH
import os
Class CD: & nbsp; & nbsp; & nbsp; & nbsp; "" "Trình quản lý bối cảnh để thay đổi thư mục làm việc hiện tại" "" & nbsp; & nbsp; & nbsp; & nbsp; def __init __ ;
"""Context manager for changing the current working directory"""
def __init__[self, newPath]:
self.newPath = os.path.expanduser[newPath]
& nbsp; & nbsp; & nbsp; & nbsp; def __enter __ [self]: ; & nbsp; & nbsp; os.chdir [self.newpath]
self.savedPath = os.getcwd[]
os.chdir[self.newPath]
& nbsp;
os.chdir[self.savedPath]