2011-02-02 45 views
5

Tôi đang sử dụng os.system() để thực hiện các lệnh thực thi dòng lệnh của Windows. Tôi muốn thay đổi thư mục hiện tại của Windows cmd. Dưới đây là một cách để thực hiện:Python: Có thể thay đổi thư mục dòng lệnh của Windows dòng lệnh mà không thay đổi thư mục hiện tại thực tế không?

os.chdir('newPath') 

Nhưng chdir() cũng sẽ thay đổi thư mục hoạt động hiện tại của Python. Tôi không muốn thay đổi thư mục làm việc Python thực vì tôi muốn các phần khác của kịch bản của tôi chạy trong thư mục làm việc hiện tại ban đầu. Những gì tôi muốn thay đổi chỉ là thư mục làm việc hiện tại của Windows cmd. Nói cách khác: tôi muốn os.system() lệnh để chạy trong một thư mục làm việc hiện tại (Windows cmd hiện tại thư mục làm việc) trong khi bất cứ điều gì khác nên chạy trong một thư mục làm việc hiện tại (thư mục làm việc hiện tại Python).

Đây là một cố gắng thay đổi chỉ Windows cmd thư mục hiện hành:

os.system('cd newPath') 

Tuy nhiên, đó rõ ràng là không hoạt động kể từ ngay sau khi thực hiện các lệnh cd newPath Windows cmd thư mục hiện hành được thiết lập lại (vì tôi sẽ không sử dụng cùng một shell lệnh Windows trong lần gọi tới os.system()).

Có thể có thư mục làm việc hiện tại riêng biệt cho vỏ Windows cmd không? (tách biệt với thư mục làm việc hiện tại).

+1

'Tôi muốn giữ cho thư mục làm việc hiện tại trong khi chỉ thay đổi Windows cmd directory' làm việc hiện tại - những gì? –

+0

@BlueRaja: Bạn nói đúng. Tôi không rõ. Chỉ cần chỉnh sửa câu hỏi để làm cho nó rõ ràng hơn. – snakile

Trả lời

7

Mô-đun subprocess nhằm thay thế os.system.

Trong số những thứ khác, nó cung cấp cho bạn subprocess.Popen(), trong đó có một đối số cwd để chỉ định thư mục làm việc cho quá trình sinh sản (cho chính xác tình huống của bạn).

Xem: http://docs.python.org/library/subprocess.html

sử dụng Ví dụ thay thế os.system:

p = subprocess.Popen("yourcmd" + " yourarg", shell=True, cwd="c:/your/path") 
sts = os.waitpid(p.pid, 0)[1] 
+0

Cảm ơn. Bạn có thể thêm một vài từ vào điều 'os.waitpid()' không? – snakile

+1

@snak waitpid được mô tả trong tài liệu. Bạn thậm chí có thể đoán những gì nó làm. –

+3

'retcode = subprocess.call ([" yourcmd "," arg1 "," arg2 "], shell = True, cwd =" c:/your/path ")' – Apalala

1

Nếu nó chỉ có làm việc trên Windows, một trong những cách có thể là:

os.system('start /d newPath cmd') 
+0

tại sao không chỉ 'bắt đầu cd mypath'? Hoevever nó không phải là khá rõ ràng, nơi câu hỏi này là đi, xem xét những gì zigdon và những người khác chỉ ra – MattiaG

+0

Tôi đoán cùng một loại giải pháp được áp dụng cho Linux là tốt. –

1

Khi bạn sử dụng os.system, bạn không tái sử dụng vỏ lệnh tương tự, nhưng đẻ trứng một cái mới cho mỗi yêu cầu. Điều này có nghĩa là bạn không thể thực sự mong đợi những thay đổi trong nó để truyền bá giữa các lời gọi.

Bạn có thể viết trình bao bọc, điều này sẽ luôn thay đổi thành thư mục bạn muốn trước khi khởi chạy lệnh.

+0

Cảm ơn, nhưng tôi biết thực tế là tôi không tái sử dụng cùng một trình bao. Những gì tôi đã yêu cầu là làm thế nào để khắc phục vấn đề đó và thay đổi các cửa sổ hiện tại dir mà không thay đổi thư mục hiện tại thực tế. – snakile

Các vấn đề liên quan