2010-09-21 32 views
13

Tôi có một kịch bản python đó là dưới thư mục này:Python: subprocess với thư mục làm việc khác nhau

work/project/test/a.py 

Bên a.py, tôi sử dụng subprocess.POPEN để khởi động quá trình này từ thư mục khác,

work/to_launch/file1.pl, file2.py, file3.py, ... 

Python Mã số:

subprocess.POPEN("usr/bin/perl ../to_launch/file1.pl") 

và đang hoạt động/dự án /, tôi nhập ing

[[email protected] project]python test/a.py, 

lỗi "file2.py, 'Không có tập tin hoặc thư mục"

Làm thế nào tôi có thể thêm work/to_launch/, vì vậy mà những tập tin này phụ thuộc file2.py thể được tìm thấy?

+5

bạn có thể thử lập luận usin cwd trong Popen: http://stackoverflow.com/questions/1685157/python-popen-working-directory-argument – Ayrat

+0

Trong Python sử dụng 'import os 'then 'os.chdir ('/tmp/yourdirectory ')' Điều đó sẽ thiết lập thư mục hiện tại cho tập lệnh python của bạn. –

Trả lời

15

Mã của bạn không hoạt động vì đường tương đối được nhìn thấy tương đối với vị trí hiện tại của bạn (một cấp phía trên test/a.py).

Trong sys.path[0] bạn có đường dẫn của tập lệnh hiện đang chạy.

Sử dụng os.path.join(os.path.abspath(sys.path[0]), relPathToLaunch) với relPathToLaunch = '../to_launch/file1.pl' để nhận đường dẫn tuyệt đối đến file1.pl và chạy perl với nó.

EDIT: nếu bạn muốn khởi chạy file1.pl từ thư mục của nó và sau đó trở lại, chỉ cần nhớ thư mục làm việc hiện tại của bạn và sau đó chuyển trở lại:

origWD = os.getcwd() # remember our original working directory 

os.chdir(os.path.join(os.path.abspath(sys.path[0]), relPathToLaunch)) 
subprocess.POPEN("usr/bin/perl ./file1.pl") 
[...] 

os.chdir(origWD) # get back to our original working directory 
+0

tôi xin lỗi, nhưng file1.pl có thể được tìm thấy và chạy. vì tôi đang chạy python trong thư mục "/ work/project", không nằm trong thư mục "work/project/test". Vấn đề là tệp 2, tệp 3, được gọi bởi tệp1.pl không thể tìm thấy. – pepero

+0

Vâng, sau đó nó có vẻ là một vấn đề Perl trong file1.pl của bạn? – eumiro

+0

Xin chào, eumiro, cảm ơn bạn đã trả lời. Tuy nhiên, nó không thể giải quyết vấn đề, bởi vì tất cả các tập tin khác file1.pl, vv chúng không nằm trong thư mục làm việc python hiện tại, thay vào đó chúng đều giả định trong thư mục /..../to_launch/. ví dụ. bên trong file1.pl, nó trực tiếp gọi "./file3.py", và tôi không thể thay đổi đường dẫn này trong file1.pl. Để thực hiện một tổng hợp ngắn, Hãy để tôi rephase câu hỏi của tôi: trong python, làm thế nào để gọi một chương trình khác, mà đang chạy theo một thư mục làm việc? – pepero

0

Bạn có thể sử dụng mã này để thiết lập thư mục hiện hành:

import os 
os.chdir("/path/to/your/files") 
+0

tốt, ok, tôi đã thử os.chdir, và lệnh này dường như thay đổi thư mục làm việc hiện tại của tôi. Vấn đề là tôi phải lau một vài tiến trình con, và mỗi tiến trình con sẽ gọi mã trong các thư mục tương ứng, chẳng hạn như work/to_launch/A/file1.pl, file2.py, vv và work/to_launch/B/file1.pl ., tệp2, tệp3. ... Ngoài ra nếu tôi sử dụng chdir, làm thế nào để tôi thay đổi trở lại? tôi có nghĩa là bên trong chương trình của tôi, tôi thường xuyên tiêm các lệnh này để thay đổi qua lại. nó không phải là rất tốt. Tôi giả sử python nên có một số cách mà dễ dàng có thể được sử dụng để thêm thư mục phụ thuộc. – pepero

+0

Ngoài ra, tôi đang khởi chạy một số quy trình con, vì vậy tôi không chắc chắn cách thức này sẽ hoạt động đối với quy trình cha mẹ và con cái – pepero

+0

vì vậy giả sử file1.pl có đường dẫn abs /a/b/c/file1.pl để chạy lệnh của bạn như hệ điều hành này .chdir ("a/b/c /") và sau đó thực hiện file1.pl Tôi nghĩ rằng nó sẽ làm việc. – anijhaw

1

Sử dụng đường dẫn tương đối so với kịch bản, không phải là thư mục làm việc hiện tại

os.path.join(os.path.dirname(__file__), '../../to_launch/file1.pl) 

Xem thêm câu trả lời của tôi để Python: get path to file in sister directory?

+0

HI, Adam, vấn đề là file1.py sẽ cần phải gọi các tệp khác, tất cả đều nằm trong một thư mục làm việc khác. xin vui lòng xem bình luận của tôi ở trên. Cảm ơn tất cả các bạn cho bài đăng của bạn. – pepero

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