web-dev-qa-db-ja.com

WindowsでのPythonの開発とLinuxへのデプロイ

Linuxでアプリケーションをホストしたいクライアントがいます。ただし、同僚と私はLinuxの経験がほとんどありません。これは低予算の短いプロジェクトなので、時間とお金を節約する選択をすることは、単に望まれるだけでなく、必須です。また、継続的な統合と自動化にも力を入れており、その多くはWindowsですでに把握しており、以前のプロジェクトから再利用できます。とはいえ、開発チームにLinuxを学び、自動化を再構築して、展開しようとしているのと同じ環境で開発できるようにすることは、おそらく現実的な選択肢ではありません。 (おそらくこのプロジェクトではなく、より大きなプロジェクトの場合。)チームis Pythonに十分に精通しているため、Pythonでアプリケーションを作成することは実行可能なオプションです(ほとんどの開発は.NETで行われていますが)Windowsで実行してLinuxボックスにプッシュできる優れたパッケージメカニズムを理解する必要があります。 Windowsで利用できないライブラリが必要になるとは思いません。ほとんどの場合、ネイティブコンポーネントのライブラリに関しては、psycopgsqlalchemyのみが必要です。

これらすべてにより、開発者がWindowsでアプリケーションを作成し、Linuxテスト環境にデプロイし、徹底的なテストの後に本番環境にプッシュすることはかなり魅力的なオプションのように思えますが、私はそれについて懐疑的です。 LinuxとWindowsは非常に異なるオペレーティングシステムであり、忍び寄って生活を非常に困難にする可能性のある問題について心配しています。これを行うことで実際の懸念事項はありますか(一般的なファイルパスの違いや、優れたコーディングプラクティスによって簡単に解決できるその他の一般的な事項以外に)?多くの共有ホスティングプロバイダーがLinuxでホストしていると思います。それらを使用しているすべての人が過去数十年間Linuxで開発したとは想像できません。これは私が知っているよりも一般的に行われていますか?

5
jpmc26

Pythonについては知らないが、私はJavaアプリケーションをWindowsからLinuxに、およびその逆に移動しました。Javaは、「1回書き込み、どこでも実行します"100%真実ではないかもしれないと主張していますが、ほんの少しの作業で十分に真実にすることができました(基本的にすべてがLinuxでうまく機能し、Windowsでいくつかの問題があります)。

WindowsとLinuxではWとLを使用します。

W:ファイルとフォルダは大文字と小文字を区別しません。 L:大文字と小文字を区別します。 Windowsではこれらの問題が隠されているため、Linuxでファイル名の大文字使用を慎重にテストしてください。

Windowsには、より詳細なファイルアクセス許可システムがあり、さまざまなグループとアクセス許可の共通部分を使用できます。 Linuxには、ファイルまたはフォルダーごとに1つのグループと1人のユーザーという単純なシステムがあります。プラス実行ビット。フォルダーに実行ビットを設定することで、Windowsでのようにアクセス許可をカスケードする場合と、Linuxでデフォルトで行うように各ファイルを作成したユーザーおよびグループに設定する場合のように、他にもいくつかの小さなことがありました。これらの問題は主に、たとえばインストール中にファイルを圧縮および解凍するときに発生します。

W:ドライブはルートフォルダーに文字としてマウントされます。 L:ドライブはどこにでもマウントされます。 1つのファイルがファイルシステムの複数の場所に表示される場合があります(シンボリックリンク)。

フォルダー区切り:W:\ L:/

パス区切り文字:W:; L::

テキストファイルの行末:W:\ r\n L:\ n

デフォルトの文字セット:W:ISO-8859-1 L:UTF-8

対象とするLinuxディストリビューションを知る必要があります。違いの2つの領域は、System V initスクリプトの処理方法とスーパーユーザータスクの実行方法(Sudoとsu)です。また、インストールスクリプトについても説明しました。 AptとYumは人気がありますが、ディストリビューションが使用するツールを使用する必要があります。RedHatではyumを使用し、Debianではaptなどを使用します。

これが、仮想か物理かに関係なく、テスト用のLinuxマシンが必要な理由です。対象とするのとまったく同じディストリビューションを使用する必要があります。誰かに古いサーバーなどにデュアルブートをセットアップしてもらいます。また、すべての開発者に cygwin を強くお勧めします。ファイルのアクセス許可はLinuxとまったく同じではなく、大文字と小文字を区別するように設定できます(ただし、Windowsでは大文字と小文字を区別しない方が便利です)が、かなり合理的なテストベッドになります。

WindowsとLinuxの両方を知っていても問題はありません。一度知ったら、何が最適かについて情報に基づいた選択を行うことができます。私はキャリアの最初の10年間、Windowsのみの開発者でした。私は過去4〜6年間、ほぼ純粋にLinuxでしたので、私のWindows情報の一部は古いかもしれません。私はまだInternet Explorerでテストを行うために仮想マシンでWindowsを実行しています。

Linuxですぐに慣れる1つのことは、エラーメッセージをグーグルすることでほとんどの問題を解決できることです。コマンドラインツールの90%は、「man」と入力した場合の動作を示しています。本当に必要な場合は、ディストリビューションによっては、ほとんどのソースコードを簡単に入手できます。 Linuxの問題を解決すると、コンピューターが実際にどのように機能するかについて何かを学んだような気がします。 Windowsでは、何かが機能するまで、盲目的に物事を試し続けているような気がします。解決策を見つけたとき、私が試したすべてを思い出すことができて幸運です。

Linuxの学習に時間を費やすことをお勧めします。この仕事は、その学習の一部に対して報酬を得る方法となる場合があります。しかし、誘惑を機会と誤解しないでください。時間枠が本当に短い場合、またはお金が限られている場合、知っていること(Windows)に展開する必要があるか、仕事を引き受けないと言う必要があるかもしれません。

11
GlenPeterson

Pythonコード

アプリケーションが適切に動作するEggまたは一連の卵であり、pipまたはeasy_installを使用してそれをvirtualenvに簡単にデプロイできるようになったらすぐに、どのプラットフォームでも問題ありません。

注意すべきこと:

  • ネイティブコードの依存関係。これらを含む卵(psycopgなど)に依存している場合があります。そのような卵がWindowsとLinuxで同等にサポートされていることを確認してください。
  • ファイルパス。ハードコードされた"\"はどこでも使用しないでください。常にpath.seppath.joinなどを使用します。
  • ファイル名。 Unixファイルシステムでは大文字と小文字が区別されるため、「Foo」と「foo」は異なるファイルです。ファイル名の大文字と小文字は区別しないでください。

アプリサーバー

おそらくあなたはウェブアプリを書いているでしょう。通常、その一部は非Pythonです。Webサーバー、DBサーバーなどです。たとえば、Windowsバージョンのnginxはありますが、uwsgiはありません。

弾丸をかむ

開発、単体テスト、統合テストの一部をWindowsで行うことはできますが、アプリをLinuxにデプロイする方法はありません。

LinuxをVirtualBoxにインストールするか、VPS(Amazon AWS、DigitalOceanなど)を使用します。顧客のターゲット展開環境をできるだけ忠実に模倣するようにしてください。

Webサーバー、memcached、またはプラットフォーム固有のその他のコンポーネントなど、Python以外のコンポーネントをそのマシンにインストールします。それらについて強い意見を持っている場合は、これらの設定を顧客に依頼してください。 Postgresやその他のプラットフォームに依存しないものを好きな場所に保管できます。

Linuxマシンに定期的にデプロイします。通常はssh linux-machinepip -U install <your-eggs>、たとえばSudo service uwsgi restartのみです。あなたはそれに対処するためにエキスパートシステム管理者である必要はありません。ただし、途中でLinuxの知識を学んだ場合は、将来的に役立つことを確認してください。

7
9000