2011-12-15 25 views
8

Tôi có một chương trình nhỏ trong python bao gồm một tệp .py cùng với thư mục tệp dữ liệu được chương trình sử dụng.Kịch bản cài đặt thích hợp cho một chương trình Python nhỏ (Không phải mô-đun) trong Linux

Tôi muốn biết cách thích hợp để tạo thủ tục cài đặt cho người dùng có quyền quản trị trên Linux để có thể cài đặt chương trình trên hệ thống của mình và sử dụng nó từ dòng lệnh, với các tùy chọn và tham số. EDIT: Phần tôi gặp sự cố với là có chương trình, sau khi cài đặt, truy xuất các tệp dữ liệu, chứa trong thư mục con 'dữ liệu'.

Tập lệnh thiết lập có cài đặt tệp chương trình thực thi trong /usr/local/bin và thư mục dữ liệu trong /usr/share/my_program/data là giải pháp có thể chấp nhận được không? Một cái gì đó như:

#!/bin/bash 
# Launch with sudo 
chmod +x program.py 
cp program.py /usr/local/bin 
cp -r data /usr/share/my_program 
echo Installation complete 

Bây giờ, để làm được điều đó, tôi phải thừa nhận, trong chương trình, rằng các tập tin dữ liệu sẽ được trong /usr/share/my_program/data. Nhưng tôi cũng sẽ để người dùng lựa chọn sử dụng chương trình mà không cần cài đặt nó. Sau đó, tôi sẽ phải giả định rằng dữ liệu nằm trong './data', liên quan đến tệp chương trình thực thi. Tôi nên giải quyết vấn đề này như thế nào? Tôi có thể nghĩ ra một vài cách, nhưng cảm giác của tôi là tôi đang tạo ra một mớ hỗn độn, nơi có một câu trả lời rõ ràng và chính xác.

Hiện nay, tôi đang xem xét sử dụng một thử except:

try: 
    find data from /usr/share/my_program && set path accordingly 
except: 
    set path to the data as './data' 

lần nữa, tôi cảm thấy đó là một chút phức tạp. Bạn sẽ tiến hành cài đặt bằng cách nào?

Rất cám ơn


EDIT: GIẢI PHÁP NUÔI

Dựa trên câu trả lời của câu hỏi này, và cho những người trong câu hỏi được đề xuất bởi FakeRainBrigand (How to know the path of the running script in Python?), tôi đã tạo ra một cài đặt kịch bản như sau:

#!/bin/bash 
mkdir /usr/share/my_program 
chmod +x my_program.py 
cp my_program.py /usr/local/bin 
cp -r data /usr/share/my_program 
echo Installation completed 

Và thêm mã sau vào chương trình của tôi:

if os.path.dirname(__file__) == "/usr/local/bin": 
    DATA_PATH = "/usr/share/my_program/data" 
elif os.path.dirname(__file__) == ".": 
    DATA_PATH = "./data" 
else: 
    print "You do not have a working installation of my_program" 
    print "See the installation procedure in the README file" 
    sys.exit(1) 

Sau đó, tôi sử dụng os.path.join(DATA_PATH, "file-to-reach.txt") để chương trình có thể truy cập dữ liệu của nó, được tìm thấy trong /usr/share/my_program.

Tôi rất vui khi có ý kiến ​​nếu có phương thức được chấp nhận hơn.

Cheers

+0

'make' không chỉ đơn thuần là C, nhưng có thể cảm thấy lạc hậu trong chương trình Python. – sarnold

Trả lời

11

Am I wrong rằng phương pháp setup.py (ví dụ: python setup.py cài đặt), chỉ để cài đặt mô-đun, sau đó sẽ được sử dụng từ bên trong người phiên dịch hoặc các kịch bản khác?

Có. Bạn sai rồi.

Bạn có thể cài đặt vào thư mục tập lệnh của Python. Tiếp tục đọc tất cả những điều setup.py có thể làm. http://docs.python.org/distutils/setupscript.html#installing-scripts

Điều này thực sự rất, rất đơn giản. Và nó không liên quan gì đến Python.

Có thể chạy tập lệnh Python từ mọi nơi. Linux cung cấp cho bạn rất nhiều cách để tạo một tệp thi hành (/path/to/my_program.py) có thể chạy được.

Tất cả những thứ đó, nhiều cách có ba điểm chung. Ba điều mà là trung tâm của Linux và không có gì để làm với Python cả.

  1. Tệp phải nằm trên số PATH của người dùng.

  2. Tệp phải có đặc quyền "thực thi" (chmod +x ...).

  3. Tệp phải bắt đầu bằng #!/usr/bin/env python.

Làm cách nào để điều này xảy ra?

Cho # 1.

  • Bạn có thể kiểm tra PATH và đặt tệp vào bất kỳ thư mục nào trên PATH. Có rất nhiều lựa chọn tiêu chuẩn cho việc này. Ví dụ: /usr/local/bin.

  • Bạn có thể sửa đổi PATH của người dùng để bao gồm một số thư mục mới. Ví dụ: /path/to để có thể tìm thấy /path/to/my_program.py.

Cho # 2. Bạn thực hiện chmod +x thích hợp.

Cho # 3. Bạn viết dòng mã thích hợp.

Để biết thêm thông tin, hãy đọc trên "Linux Shell". Tất cả các chương trình "shell" đều có ba tính năng giống nhau. bash. csh, python, perl vv, vv, vv


lấy các tập tin dữ liệu, chứa trong một 'dữ liệu' thư mục con, trong khi đề cập đến chúng như ./data/this_file.dat, ví dụ.

Đó sẽ là thiết kế kém.

Linux (bên ngoài Python) cung cấp nhiều cách để tìm tệp dữ liệu hữu ích.

  1. Cài đặt chúng ở vị trí đã biết với đường dẫn đã biết. /usr/local/share đến với tâm trí. Đây có thể không phải là vị trí tốt nhất, nhưng nó khá phổ biến.

  2. Sử dụng biến môi trường. Ví dụ: MYAPP_HOME có thể được đặt thành vị trí của tệp. Bạn có thể sử dụng os.path.join(os.environ['MYAPP_HOME'], 'data', 'this_file.dat') Rất phổ biến.

  3. Sử dụng biến số __file__ để tìm vị trí tập lệnh của bạn.Sau đó sử dụng os.path để xác định vị trí thư mục và lắp ráp các đường dẫn dữ liệu với os.path.join(this_directory, 'data', 'this_file.dat')

+0

Xin chào S.Lott Cảm ơn lời khuyên của bạn. Tôi biết ba bước bạn đề cập (đường dẫn, bit thực thi và shebang!). Tuy nhiên, bằng cách sử dụng kiến ​​thức này, tôi không thể làm cho chương trình làm việc, biết rằng nó phải sử dụng một số tệp trong thư mục con 'dữ liệu'. Vì hiện tại tôi không biết người dùng sẽ đặt chương trình ở đâu, tôi không thể 'hardcode' đường dẫn của thư mục vào mã (có thể là một ý tưởng rất tồi tệ trong mọi trường hợp). Tôi đang tìm một quá trình cài đặt mà cả hai sẽ làm cho các tập tin chương trình được tìm thấy trong đường dẫn VÀ làm cho nó có thể trỏ đến dữ liệu như: './data/this_file.dat'. Tôi nên tiến hành như thế nào? – Morlock

+0

@Morlock: "Vì tôi hiện không biết người dùng sẽ đặt chương trình ở đâu". Đó sẽ là một sai lầm về phía bạn. Vì đó là câu hỏi ** thực ** của bạn, vui lòng ** cập nhật ** câu hỏi để bao gồm mô tả về vấn đề ** thực ** của bạn. Ngoài ra, hãy xem tài liệu Python một số chi tiết. Tất cả thông tin bạn muốn thực sự có sẵn. Biến toàn cầu '__file__' chẳng hạn, sẽ cung cấp nhiều thông tin. –

+0

Câu hỏi đã được cập nhật. Tôi nghĩ rằng câu hỏi thực sự đang nổi lên như là kết quả của cuộc đối thoại với bạn và FakeRainBrigand. Cảm ơn bạn đã cập nhật. Tôi nghĩ rằng tôi có tất cả các tùy chọn tôi cần bây giờ và sẽ đọc thêm về những con đường bạn đề nghị. – Morlock

2

Nếu bạn không có phụ thuộc bên ngoài, chẳng hạn như cơ sở dữ liệu hoặc cài đặt mà cần phải được cấu hình, một kịch bản setup.sh đơn giản nên làm.

DIR=`pwd` 
NAME=my_app.py 
echo "#!/usr/bin/env sh 
python $DIR/my_app.py" > /usr/sbin/$NAME 
chmod a+x /usr/sbin/$NAME 

Điều này có thể phức tạp hơn tùy theo nhu cầu của bạn.

+0

Tôi thấy logic, nhưng làm thế nào nó sẽ cho phép tôi sử dụng các tập tin cần thiết bởi tập tin chương trình của tôi (theo program_folder/dữ liệu)? Tôi sẽ đặt tập tin thực thi dưới/usr/local/bin, nhưng thư mục 'data' thì sao? Cảm ơn. – Morlock

+0

Có thể có một thư mục dành riêng cho dữ liệu mà tôi có thể đặt các tệp dữ liệu và mong đợi chúng ở đó?/usr/share/my_program? Là một thực hành tốt để làm điều đó và sau đó hardcode vị trí của các tập tin này trong kịch bản của tôi, mà sẽ được trong/usr/local/bin? Điều này nghe có vẻ quá đơn giản là đúng :) Mối quan tâm của tôi là tìm hiểu một cách thích hợp để làm điều này cho các chương trình tương lai của tôi. – Morlock

+0

@Morlock, thực sự không có * vị trí chính xác * nào để đặt chúng. Nó hoàn toàn chấp nhận được để lại cho họ nơi người dùng đặt chúng. [Câu trả lời ở đây] có thể giúp bạn nhận được tại thư mục dữ liệu của bạn. – FakeRainBrigand

0

Bạn có thể tạo tệp zip có thể thực thi chứa tệp tập lệnh và dữ liệu của bạn mà tệp sử dụng. Cài đặt chỉ cần đặt tệp này ở đâu đó trong $PATH và làm cho tệp có thể thực thi: chmod +x my-program.

python: can executable zip files include data files?

Nếu bạn tạo một setup.py thích hợp mà xác định làm thế nào để cài đặt tập tin dữ liệu của bạn và kịch bản sau đó có rất nhiều lựa chọn hơn để cài đặt chương trình ví dụ:

$ pip install --user http://example.com/your-program.tar.gz 

nơi pip thể được cài đặt thông qua trình đóng gói hệ thống, your-program.tar.gz bạn có thể tạo bằng cách sử dụng python setup.py sdist.

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