簡體   English   中英

如何讓我的setup.py使用我的文件的相對路徑?

[英]How can I get my setup.py to use a relative path to my files?

我正在嘗試使用distutils構建一個Python發行版。 不幸的是,我的目錄結構如下所示:

/code
    /mypackage
        __init__.py
        file1.py
        file2.py
        /subpackage
            __init__.py
    /build
        setup.py

這是我的setup.py文件:

from distutils.core import setup

setup(
    name = 'MyPackage',
    description = 'This is my package',
    packages = ['mypackage', 'mypackage.subpackage'], 
    package_dir = { 'mypackage' : '../mypackage' }, 
    version = '1',
    url = 'http://www.mypackage.org/',
    author = 'Me',
    author_email = 'me@here.com',
) 

當我運行python setup.py sdist它正確生成清單文件,但不包括我在分發中的源文件。 顯然,它創建了一個包含源文件的目錄(即mypackage1 ),然后將每個源文件復制到mypackage1/../mypackage ,這將它們放在分發之外

如何在不強制我的目錄結構符合distutils期望的情況下更正此問題?

您希望在分發歸檔文件中使用什么目錄結構? 和你現有的結構一樣嗎?

您可以使用此修改后的setup.py打包一個目錄更高的內容(示例中的code ):

from distutils.core import setup

setup(
    name = 'MyPackage',
    description = 'This is my package',
    packages = ['mypackage', 'mypackage.subpackage'], 
    version = '1',
    url = 'http://www.mypackage.org/',
    author = 'Me',
    author_email = 'me@here.com',
    script_name = './build/setup.py',
    data_files = ['./build/setup.py']
)

你運行它(在code目錄中):

python build/setup.py sdist

或者,如果你想在構建內部保持dist

python build/setup.py sdist --dist-dir build/dist

我喜歡你正在嘗試的目錄結構。 我從來沒有想過setup.py特別適合保證在根代碼文件夾中。 但無論喜歡與否,我認為這是您的發行版用戶期望的結果。 因此,你必須欺騙distutils做其他事情也就不足為奇了。 data_files參數是一個hack,可以讓你的setup.py進入你找到它的同一個地方。

從項目的根文件夾運行setup.py

在您的情況下,將setup.py放在代碼/

代碼/還應包括:

  • LICENSE.TXT
  • 的README.txt
  • INSTALL.TXT
  • TODO.txt
  • CHANGELOG.txt

當您運行“setup.py sdist”時,它應該自動生成一個MANIFEST,包括: - 在py_modules和/或包中指定的任何文件 - setup.py - README.txt

要添加更多文件,只需手動編輯MANIFEST文件以包含項目所需的任何其他文件。

對於這個有點像樣的解釋, 請閱讀本文

查看工作示例簽出我的項目

注意:我沒有將MANIFEST置於版本控制之下,所以你不會在那里找到它。

是否可以先將其更改為父目錄?

import os
os.chdir(os.pardir)

from distutils.core import setup

等等

或者,如果你可能從任何地方運行它(這是矯枉過正,但......):

import os.path
my_path = os.path.abspath(__file__)
os.chdir(os.normpath(os.path.join(my_path, os.pardir)))

不確定這是否有效,但應該很容易嘗試。

也是一個蹩腳的解決方法,但構建項目內的包目錄的聯結/鏈接應該可以工作。

一個蹩腳的解決方法,但我可能只是使用一個Makefile,它將./mypackage發送到./build/mypackage,然后使用./build里面常用的distutils語法。 事實上,distutils希望將setup.py解壓縮到sdist的根目錄並在那里有代碼,所以你將有一段時間說服它做其他事情。

當你打掃干凈時,你可以隨時核對副本,這樣你就不必弄亂你的vcs了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM