-1

Python から ventrilo を実行してチャンネルに参加しようとしていますが、

    path= 'ventrilo://91.227.221.73:3824/servername=vGames&serverpassword=9929&channelname=CS.vGames.co.il GatherBot -2-/.Team-A&channelpassword=57'

    os.startfile(path)

腹腔内で得られる実際のパスは次のとおりです。CS.vGames.co.il GatherBotチャネル-2-/.Team-Aが見つからないためです。

IRCクライアントから実行すると機能するため、実行できることを知っています。私のIRCクリネットでは、それが機能する%20ためのスペースを使用しています。

Python では、インターネットで見つけられるすべてのものを試しました。私を助けてください。

4

1 に答える 1

0

ここでの正解は、URL のクエリ文字列部分を で作成することurllib.urlencodeです。例えば:

qparams = {
  'servername': 'vGames', 
  'serverpassword': '9929', 
  'channelname': 'CS.vGames.co.il GatherBot -2-/.Team-',
  'channelpassword': '57' }
path = 'ventrilo://91.227.221.73:3824/' + urllib.urlencode(qparams)

他の場所からハードコーディングされたクエリ文字列を取得した場合は、次のように使用できますurllib.quote

qstring = 'servername=vGames&serverpassword=9929&channelname=CS.vGames.co.il GatherBot -2-/.Team-A&channelpassword=57'
path = 'ventrilo://91.227.221.73:3824/' + urllib.quote(qstring)

または、別の場所から完全にハードコードされた URL を取得した場合、その URL は既に適切にエンコードされているはずです (" " は "%20" など)。手動で URL を記述した場合は、スペースを %20 に置き換えて、それが機能するまで何か他のものをエンコードするだけで、いつでも手動でエンコードできます。通訳の周り。

次のようなことを試すことができます:それを使用urlparse.urlparseしてから、encodeまたはquoteクエリ文字列部分を使用して、元に戻します。しかし、それが正しいことをするという保証はありません。あなたはそれにゴミを与えています、そしてそれはそれについて何がゴミであるかを必ずしも知っているわけではありません. たとえば、チャンネル名にはエンコードされていない「/」が含まれているため、それがどうurlparseなるかは誰にもわかりません。言うまでもなく、「?」すらありません。クエリ文字列を導入します。

そのため、この問題を回避するにはカスタム コードが必要になる場合があります。

しかし、最善の解決策は一歩後退することです。URL がどこから来たとしても、どこかの時点で誰かが、何がパスで、何がクエリ文字列で、クエリ パラメータを結合する方法などを知っているはずです。その時点での知識をキャプチャし、それを伝え、正しい方法で物事を行いurllib.urlencodeます。

于 2012-09-27T22:36:30.823 に答える